java 动态库_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 {

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值