在一些项目中,会遇到对接第三方提供的接口协议,而对方提供的是动态库文件以及其说明文档,这个时候,java如何调用第三方提供的动态库文件呢?

下面介绍三种方法来实现。

  1. JNI
  2. JNA
  3. JNative

以一个MAINDLL.DLL为例,其中有两个方法说明,如下:

int NewKey(char *room,char *gate,char *stime,char *guestname,char *guestid, char *lift, int overflag, int Breakfast, long *cardno,char * track1,char * track2);int ReadCard(char *room, char *gate,char *stime, char *guestname, char *guestid, char *lift, char *track1, char *track2, long *cardno, int *st, int *Breakfast);

显然上面的方法说明非java语言,而是C或者C++的方法声明,下面分别采用提到的三种方法来调用上面两个方法。

JNI,是Java Native Interface的缩写,他提供大量API实现了java与其他语言,主要是C/C++的通信。

JNI在调用dll的时候需要两个步骤

1)装载dll文件

有两种方式:

System.load()和System.loadLibrary()。

load需要全路径且需要有文件扩展名。

loadLibrary是特定路径,系统system32下或项目bin目录下,只要文件名称不要.dll扩展名。

2)本地声明方法

装载完dll文件后,将使用的方法用native关键字声明。

直接上代码,如下:




java加载dll类中方法_jar


JNA(Java Native Access ),提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射,通过代理方式调用。

使用步骤:

1):调入jar包,使用JNA之前我们需要在项目中首先导入JNA的jar包,有两个,jna-x.x.0-platform.jar 和 jna.jar。

2):将需要调用的第三方dll文件放在项目的根目录下。

直接上代码如下:


java加载dll类中方法_java加载dll类中方法_02


JNative,是对Jni的一种封装,Jnative内部是使用Jni去加载JNativeCpp.dll(windows系统)或者libJNativeCpp.so(Linux系统),JNativeCpp.dll内部方法中具备再次加载和释放第三方dll的功能。

使用步骤:

1):首先下载JNative的jar包,JNativeCpp.dll,libJNativeCpp.so这三个文件,其中Jnative包中包含了JNativeCpp.dll, libJNativeCpp.so文件。

JNative.jar是需要导入到Java工程的lib下。 通过Build Path即可导入。 建议将JNative.jar放在jdk的jrelibext文件里。

JNativeCpp.dll是放入到jdk的jrebin文件里,如果没放,系统会自动解压包中该文件到当前运行的目录下。

libJNativeCpp.so是Linux操作系统的,目前只针对windows系统下测试。

2):由于 JNativeCpp.dll是32为windows程序,所以需要下载jdk 32位的版本才可以。这

点要注意了

3):将需要调用的dll动态链接库放置到system32文件里或者当前运行环境下,否则就会出现找不到dll文件的错误。

直接上代码如下:


java加载dll类中方法_jar包_03


JNative的好处在于可以自由释放第三方DLL文件,而JNA的释放需要通过反射调用内部的dispose方法,而且JNA的dispose方法并未完全卸载,只是释放掉加载dll的句柄,使其内存地址为0,需等待gc回收。