mianhuaman 发表于 2013-2-1 12:12:31

Java 调com 组件(dll文件)

1. java 核心 jni 原理绍
前一段时间有同事长问我说java 设用dll 库很不方便可他不会c/c++ 
因为java 1.0 版本后有一个接口名为jni
他的原理就是
.java---编译--->.class---javah-->.h-----引用---.c/.cc/.cpp---->.dll
最后
.java中有一条 System.loadLibrary("DllName");
在通过public native static getUserInfo(String username,String sid);
来调c 实现的方法
这样对c/c++ 有一定功底的人来说是没有多大问题的。
但是要想调dll 、com 组件 没有必要做这一些事情
早在1999年开源组织就以经出现了像jacob 这一类开源项目,当然做的比较成
功有很多,例如jacob、jacom、jawin、jnative等
在这时给大家介绍一个最成熟的项目jacob 早在1999年就成立了这个开源项目
经过了十几年的测试应用。所以要相信开源相信java 的魅力。
 
 
2. 下载jacob 开源包
 在jdk/bin 目录下加入jacob.dll 文件
3.下载 1.15 版本
Regsvr32 filename.dll 注册该文件 如果没有成功说明 对应com 组件依敕的dll 文件没有(同c/c++) 一样对应的
依赖包将这些方入jdk /bin目录下
这一步一定要注册成功,不然后面的就没有办法了
你想如果注册没有成功c 都调不到java 肯定也调不到你说对吧
 
4. 写代码就很容易了不是
 当然接口中加入jacob.jar 包
package com.test;import com.jacob.activeX.ActiveXComponent;import com.jacob.com.Dispatch;import com.jacob.com.Variant;/** ** 2008-10-5 * @author liuqing * */public class JaCobTest { int EXCEL_HTML = 44;   /** * @param args */public static void main(String[] args) {                                 //注册com组件ActiveXComponent app = new ActiveXComponent("PB80.n_fl_tj_xs_interface");try {Dispatch disp = app.getObject();Object []ob = new Object[]{"argOne","argTwo"};Variant v = Dispatch.callN(disp, "of_qx_tjdj", ob);int a = v.getInt();System.out.println("com 接口说:" + a);}catch (Exception e) {}}/** * Excel 测试 * @param xlsfile * @param htmlfile */public void excelToHtml(String xlsfile, String htmlfile)   {          ActiveXComponent app = new ActiveXComponent("Excel.Application"); // 启动excel         try{            app.setProperty("Visible", new Variant(true));            Dispatch excels = app.getProperty("Workbooks").toDispatch();             Dispatch excel = Dispatch.invoke(excels,"Open",Dispatch.Method,new Object[] { xlsfile, new Variant(false),new Variant(true) }, new int).toDispatch();             Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(EXCEL_HTML) }, new int);             Variant f = new Variant(false);             Dispatch.call(excel, "Close", f);          }          catch (Exception e) {            e.printStackTrace();          }          finally {               app.invoke("Quit", new Variant[] {});          }      }   } 
 
  运行OK
 
 
 
页: [1]
查看完整版本: Java 调com 组件(dll文件)