前一段时间,在项目需求中,需要调用一下第三方的动态库文件,下面是本人一些尝试的经历。
首先需要明白的是,在java中是不能直接调用动态库文件的,因为动态库文件是使用c或是c++编写的,作为一种跨 平台的编程语言,java提供了一些用来读取dll文件方法,
一种是直接用JNI,这种方法一般来说用的人比较少,因为其中涉及到c++调用文件的编写,这里就不再叙述,下面直接说我们java程序员常用的两种调用动态库的方法
1.Jna调用动态库,
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native
library的函数与结构,JNA将自动实现Java接口到native function的映射。
使用步骤:
(1):调入jar包,使用Jna之前我们需要在项目中首先导入Jna的jar包,有两个,jna-3.3.0-platform.jar 和 jna.jar
(2):将需要调用的第三方dll文件放在项目的根目录下
(3):编写调用的方法
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class HelloWorld {
public interface Dll extends StdCallLibrary {
Dll INSTANCE = (Dll) Native.loadLibrary("SiInterface", Dll.class);//加载动态库文件
public int INIT();//动态库中调用的方法
}
public static void main(String[] args) {
System.out.println(Dll.INSTANCE.INIT());
}
}
需要注意:当dll文件不在项目的根目录下,路径要写成绝对路径
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):下面是代码部分
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
public class testServlet extends HttpServlet {
static JNative jnt = null;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
String filePath =request.getSession().getServletContext().getRealPath("/");
//下面用的是文件的绝对路径
System.load("D:\\myeclipse\\JnaWeb\\WebRoot\\jna\\SiInterface.dll");
if (jnt == null) {
// 1.利用org.xvolks.jnative.JNative来加载DLL:参数1.类名
// 2.方法名
jnt = new JNative("SiInterface.dll", "INIT");
jnt.setParameter(0, "error");
// 3.设置返回参数的类型
jnt.setRetVal(Type.INT);
// 4.执行方法
jnt.invoke();// 调用方法
}
// 5.返回值
String string=jnt.getRetVal();
System.out.println("string="+string);
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} finally {
if (jnt != null) {
// 6.释放系统资源
try {
jnt.dispose();
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}