java调用本地方法(调用Dll或ocx)

去年因项目需要调用第三方接口处理数据,第三方接口使用C++写的。记录下我的使用过程。

Java如果调用Dll或OCX那么他就失去了跨平台!

一般来说java调用dll和ocx有三种方法:

1.jni

jni对C++要求较高,本人C++比较菜,所以这种方法我就不说了

2.jawin

第一步:将下载好的jawin.jar放在java_HOME的jre\lib\ext下

第二步:将jawin.dll放在system32下

如果eclipse还报错COMException : no jawin in java.library.path的话 将jdk环境删除重新添加一下。

接下来就可以写测试代码了

FuncPtr test1 = null;
int result=-1;
try {
test1 = new FuncPtr("*****.dll", "XXXXX");//第一个为dll文件(把Dll文件放在当前目录下) 第一个参数为函数名
result=test1.invoke_I("11", "22", ReturnFlags.CHECK_NONE);//传入参数
System.err.println("---------------"+result);
} catch (COMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

3.jacob

就是桥接调用com组件还可以调用x86或x64windows程序(例如可以调用office制作Word等)

第一步:将下载好的jacob-1.18-M2.zip中的dll文件放置于system32下

第二步:项目中导入对应的jar文件

注意调用的ocx文件需要和java虚拟机对应的字长,而且ocx控件需要先注册

ComThread.InitMTA(true);
ActiveXComponent com = new ActiveXComponent("CLSID:59084599**************");
Dispatch disp = (Dispatch) com.getObject();
int result=Dispatch.call(disp,"XXX",new Variant("1111"),new Variant("1111")).getInt();//第二个参数为函数名

即使这样做 程序还是可能报灾难性错误 因为ocx控件不能直接调用需要检查权限

需要在OCX控件中,重写COleControl.IsInvokeAllowed (DISPID)方法,即在控件的CMyNameCtrl中增加一个方法

BOOL CMyNameCtrl::IsInvokeAllowed (DISPID)

{

return TRUE;

}

你可能感兴趣的:(java,c/c++,开发工具)