分享

几种java调用dll的方式

 陈永正的图书馆 2017-01-11

Java调用DLL有多种方式,常用的方式有JNative、JNA、JNI等。

JNative方式调用dll

JNative是一种能够使Java语言使调用DLL的一种技术,对JNI进行了封装,可能有些读者会有这样一个问题,JNative对JNI进行了封装,并且是一种跨语言的使用DLL,会不会在效率方面很不如人意,我可以用我使用Jnative的经验告诉你,不会!因为我用Jnative就是用来处理大量的数据调用,是基于实时数据库接口的调用。而实时数据库的数据量是非常大的。
首先下载JNative
注意:将JNative解压,并将其中的JNativeCpp.dll拷贝到system32文件夹中,libJNativeCpp.so是linux平台使用的。
代码:
  1. package com.tvjody;  
  2.   
  3. import org.xvolks.jnative.JNative;  
  4. import org.xvolks.jnative.exceptions.NativeException;  
  5. import org.xvolks.jnative.util.Kernel32.SystemTime;  
  6.   
  7. public class Demo {  
  8.     public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {  
  9.         // Kernel32.dll为dll名称,Kernel32目录的位置为:C:\Windows\System32下面,  
  10.         // GetSystemTime为Kernel32.dll中的一个方法.  
  11.         JNative nGetSystemTime = new JNative("Kernel32", "GetSystemTime");  
  12.         SystemTime systemTime = new SystemTime();  
  13.         // 设置参数  
  14.         nGetSystemTime.setParameter(0, systemTime.getPointer());  
  15.         nGetSystemTime.invoke();  
  16.         // 解析结构指针内容  
  17.         return systemTime.getValueFromPointer();  
  18.     }  
  19.   
  20.     public static void main(String[] args) throws NativeException, IllegalAccessException {  
  21.         System.err.println(GetSystemTime());  
  22.         System.exit(0);  
  23.     }  
  24. }  

JNA方式调用dll

JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。
 首先下载JNA
代码:
  1. package com.tvjody;  
  2.   
  3. import com.sun.jna.Library;  
  4. import com.sun.jna.Native;  
  5. import com.sun.jna.Platform;  
  6.   
  7. public class JNA {  
  8.   
  9.     // 定义接口CLibrary,继承自com.sun.jna.Library  
  10.     public interface testdll extends Library {  
  11.         // msvcrt为dll名称,msvcrt目录的位置为:C:\Windows\System32下面,  
  12.         testdll Instance = (testdll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),  
  13.                 testdll.class);  
  14.         // printf为msvcrt.dll中的一个方法.  
  15.         void printf(String format, Object... args);  
  16.     }  
  17.   
  18.     public static void main(String[] args) {  
  19.         // 调用printf打印信息  
  20.         testdll.Instance.printf("yyyyMMdd");  
  21.     }  
  22.   
  23. }  

JNI调用dll

如果有一个现有的.dll/.so文件,如果使用JNI技术调用,我们首先需要另外使用C语言写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的dll/so中公布的函数。
然后再在Java中载入这个适配器dll/so,再编写Java   native函数作为dll中函数的代理。经过2个繁琐的步骤才能在Java中调用本地代码。
因此,很少有Java程序员愿意编写调用dll/.so库中的原生函数的java程序。这也使Java语言在客户端上乏善可陈。可以说JNI是Java的一大弱点!只提供几个链接吧!
http://blog.sina.com.cn/s/blog_6c3b9ed40100xyl8.html
http://www./home/space-37924-do-blog-id-5681.html
以上源代码下载


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多