java调用本地方法(调用Dll或ocx)
2015-03-26 13:22
661 查看
去年因项目需要调用第三方接口处理数据,第三方接口使用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如果调用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中,Jni调用DLL文件本地方法
- JNA—JNI终结者,java调用dll、ocx、so最简单的方法
- JAVA高级【10.2】《Java核心技术2》本地方法-几种java调用dll的方式
- JNA—JNI终结者,java调用dll、ocx、so最简单的方法
- JNA—JNI终结者,java调用dll、ocx、so最简单的方法
- JAVA通过JNI调用c++本地方法dll
- JAVA通过JNI调用本地C语言方法
- JNI调用本地库 打包后的使用dll的方法 [转载]
- 关于Java调用dll的方法
- JAVA通过JNI调用本地C语言方法
- java调用Dll是方法中存在指针或变参的解决方法
- Java调用 dll 文件里的方法
- java web JNative调用dll动态链接库:和注意方法
- java调用Dll特定方法
- JAVA通过JNI调用本地C语言方法
- JAVA通过JNI调用本地C语言方法
- 关于Java调用dll的方法
- JAVA通过JNI调用本地C语言方法
- 关于Java调用dll的方法
- Java通过JNI调用本地DLL