IT忍者神龟之java调用dll动态库文件

在项目需求中,需要调用一下第三方的动态库文件,下面是本人一些尝试的经历。

首先需要明白的是,在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 {
}
}

猜你喜欢

转载自blog.csdn.net/vipyhd/article/details/80202714