一、什么是dll文件
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
二、Java调用dll文件方法
1.Jna调用动态库
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到nativefunction的映射。
使用步骤:
(1):调入jar包,使用Jna之前我们需要在项目中首先导入Jna的jar包,有两个,jna-3.3.0-platform.jar和 jna.jar.下载:点击打开链接
(2):将需要调用的第三方dll文件放在项目的根目录下
(3):编写调用的方法
package com.test.dll;
import com.sun.jna.Library;import com.sun.jna.Native;
/**
* dll文件名称 dll.dll
* dll文件方法名function,参数类型String,返回类型String
* @author july
*
*/
public class JNATest{
public interface JNATestDll extends Library{
//dll文件放在C:\Windows\System32下
JNATestDll instanceDll = (JNATestDll)Native.loadLibrary("dll.dll",JNATestDll.class);
public String function(String param);
}
public static void main(String[] args) {
String param="aa";
String returnvalue = JNATestDll.instanceDll.function(param);
System.out.println("returnvalue = "+returnvalue);
}
}
2.Jnative调用动态库
使用步骤:
(1):首先下载JNative的jar包,其中包含JNative.jar, JNativeCpp.dll, libJNativeCpp.so这三个包。
JNative.jar是需要导入到Java工程的lib下。通过Build Path即可导入。建议将JNative.jar放在jdk的jre\lib\ext文件里。
JNativeCpp.dll是必须放入到jdk的jre\bin文件里,否则就会报JNative找不到的错误。
libJNativeCpp.so是Linux操作系统的,暂时不予说明。
(2):由于JNativeCpp.dll是32为windows程序,所以需要下载jdk 32位的版本才可以。这一点要注意了.
(3):将需要调用的dll动态链接库放置到system32文件里,否则就会出现找不到dll文件的错误。
(4):下面是代码部分
package com.jsld.client;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
public class test {
public static void main(String[] args) {
try {
//调用dll,获取结果
JNative.setLoggingEnabled(true);
System.load("D:\\dll.dll"); //dll文件加载路径
JNative getFunction = new JNative("dll.dll", "function");//dll名称,调用方法
getFunction.setRetVal(Type.STRING); //设置返回值类型为:
StringgetFunction.setParameter(0,"aa"); //按顺序设置方法需要的参数值
getFunction.invoke(); //调用方法
String retval=getFunction.getRetVal(); //dll返回值
System.out.println("調用结果==\n"+retval);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NativeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意:1.jdk版本与dll版本对应,32位还是64位
2.Java参数类型与dll方法参数类型是否对应