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[1]).toDispatch();
Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[] {htmlfile, new Variant(EXCEL_HTML) }, new int[1]);
Variant f = new Variant(false);
Dispatch.call(excel, "Close", f);
}
catch (Exception e) {
e.printStackTrace();
}
finally {
app.invoke("Quit", new Variant[] {});
}
}
}
运行OK