你所不知道的java调用dll

来源:互联网 发布:课文阅读软件 编辑:程序博客网 时间:2024/04/29 16:05

       前段时间,帮客户做了点东西,用java调用dll,最近要写博客呢,就整理一下,给现在将要用和以后用的朋友们提供点方便,少走一些弯路。

      总的来说,java调用dll还是比较顺利的,现在先说一下什么是dll吧,dll是Dynamic Link Library 的缩写形式,中文是动态链接库,是一个包含多个程序同时使用的代码和数据的库,dll不是可执行文件,不过可以被调用。

     网上有多种调用方法有JNA调用的,有JNI调用的,还有JNative调用的,经过比较,我选择了JNative,JNI的方法是我调用so的时候,以后会介绍的。

     首先要下载JNative组件,jnative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2,1.4的我也试过,也没有什么区别,可能会有区别吧,只是我调用的时候没有涉及到。  然后就是解压了,获得三个文件,分别是:JNativeCpp.dlllibJNativeCpp.soJNative.jarJNativeCpp.dll Windows下用的,拷贝到windows / system32目录下;libJNativeCpp.so Linux下的,拷贝到系统目录下;JNative.jar 这是一个扩展包,导入工程LIB中或将其拷贝到jdk\jre\lib\ext下,系统会自动加载。如果你是用eclipse调用的话,直接放到src目录下就可以了。

       测试用的dll我是用delphi写的一个名为MyJavaDll的dll,dll中包含一个Triple函数,返回一个整形的结果,调用方法我是参考网上的资料,自己编写的,可能会和网上的一些有些类似。

     首先配置好JNative组件的windows环境:

     Native要用到JNativeCpp.dll放在系统盘的\WINDOWS\system32

    JNative.jar导入工程中,新建一个调用类:

   

    java 代码

    package com.test;

 

    import org.xvolks.jnative.JNative;

    import org.xvolks.jnative.Type;

    import org.xvolks.jnative.exceptions.NativeException;

 

    publicclass AppSvrTestConnect {

          public AppSvrTestConnect() {   

            

                 }   

                 

                 /**  

                  *测试调用结果 

                  *      

                  *@returnint6:成功0:失败  

                  *@throwsNativeException  

                  *@throwsIllegalAccessException  

                  */  

                privatestaticfinalint TestConnect(int num)throws NativeException, IllegalAccessException {   

                 JNative n = null;   

                    try {              

                         n = new JNative("MyJavaDll.dll","Triple"); 

                         n.setRetVal(Type.INT);   

                         int i = 0;    

                         n.setParameter(i++, Type.INT,"" + num);    

                  

                         System.out.println("调用的DLL文件名为:"+n.getDLLName());

                         System.out.println("调用的方法名为:"+n.getFunctionName());

 

                      

                         n.invoke();   

                         return Integer.parseInt(n.getRetVal());   

                     } finally {   

                         if (n !=null)   

                             n.dispose();   

                   }   

               }

          

                 /**  

                   *Dll文件放在WINDOWS\system32目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库  

                   *TestConnectFromDllPath     

                   *@throwsNativeException  

                   *@throwsIllegalAccessException  

                   */  

                  publicstaticfinalint TestConnectFromDllPath() throws NativeException, IllegalAccessException{   

                       System.loadLibrary("MyJavaDll");   

                       returnTestConnect(3);   

                  }   

 

 

    }

  

        这个类实现了一个静态私有方法,用来调用Dll文件中的方法返回结果

        private static final int TestConnect(int num)

        一个静态公共方法,装载DLL文件

        public static final int TestConnectFromDllPath() //通过ClassLoader 
         
然后新建一个类,调用AppSvrTestConnect.java,实现方法调用,我是将MyJavaDll.dll文件放在了WINDOWS\system32目录下,JVMClassloader的时候会自动加载,然后通过System.loadLibrary("MyJavaDll ")就可以装配DLL文件.
          java
代码
         publicclass Demo {

 

          /**

         *@paramargs

         *@throwsIllegalAccessException

          *@throwsNativeException

          */

         publicstaticvoid main(String[] args)throws NativeException, IllegalAccessException {

             Demo demo=new Demo();

             demo.getInfo();

         }

          publicint getInfo()throws NativeException, IllegalAccessException{   

               

                     

                      // Dll文件已经放在WINDOWS\system32目录下面   

                      int info = AppSvrTestConnect.TestConnectFromDllPath();   

                     

                       //结果6为成功  

                      if (info == 6)   

                           System.out.println("调用成功");   

                      else  

                          System.out.println("调用失败");   

                     

                      return info;   

                }   

 

 

        }

          System.loadLibrary():装载Windows\System32下或jre\binTomcat\bin目录下的本地链接库
         •
备注

        上面的示例工程,因为是例子,所以没有大多的设计,只是实现了装载DLL文件,调用DLL文件方法,返回信息.

        JNative的详细说明,请参考JNative的源程序和例子.

        注意JVM只允许一个默认的ClassLoaderload native library,同时并不提供专门的APIunload一个loaded native library,所以在项目调试的时候,独立启动Web Server.


       到此java调用dll已经结束,感觉调用挺简单的,毕竟是window环境,如果调用so就需要考虑的多了,以后我会介绍的。


原创粉丝点击