前一段时间,在项目需求中,需要调用一下第三方的动态库文件,下面是本人一些尝试的经历。
首先需要明白的是,在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 {}}
新闻热点
疑难解答