您的位置:首页 > 编程语言 > Java开发

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;

}

 

        

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jni Jacob jawin