前一段時(shí)間,在項(xiàng)目需求中,需要調(diào)用一下第三方的動(dòng)態(tài)庫文件,下面是本人一些嘗試的經(jīng)歷。
首先需要明白的是,在java中是不能直接調(diào)用動(dòng)態(tài)庫文件的,因?yàn)閯?dòng)態(tài)庫文件是使用c或是c++編寫的,作為一種跨 平臺(tái)的編程語言,java提供了一些用來讀取dll文件方法,
一種是直接用JNI,這種方法一般來說用的人比較少,因?yàn)槠渲猩婕暗絚++調(diào)用文件的編寫,這里就不再敘述,下面直接說我們java程序員常用的兩種調(diào)用動(dòng)態(tài)庫的方法
1.Jna調(diào)用動(dòng)態(tài)庫,
JNA(Java Native Access )提供一組Java工具類用于在運(yùn)行期動(dòng)態(tài)訪問系統(tǒng)本地庫(native library:如Window的dll)而不需要編寫任何Native/JNI代碼。開發(fā)人員只要在一個(gè)java接口中描述目標(biāo)native library的函數(shù)與結(jié)構(gòu),JNA將自動(dòng)實(shí)現(xiàn)Java接口到native function的映射。
使用步驟:
(1):調(diào)入jar包,使用Jna之前我們需要在項(xiàng)目中首先導(dǎo)入Jna的jar包,有兩個(gè),jna-3.3.0-platform.jar 和 jna.jar
(2):將需要調(diào)用的第三方dll文件放在項(xiàng)目的根目錄下
(3):編寫調(diào)用的方法
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);//加載動(dòng)態(tài)庫文件
public int INIT();//動(dòng)態(tài)庫中調(diào)用的方法
}
public static void main(String[] args) {
System.out.println(Dll.INSTANCE.INIT());
}
}
需要注意:當(dāng)dll文件不在項(xiàng)目的根目錄下,路徑要寫成絕對路徑
2.Jnative調(diào)用動(dòng)態(tài)庫
使用步驟:
(1):首先下載JNative的jar包,其中包含JNative.jar, JNativeCpp.dll, libJNativeCpp.so這三個(gè)包。
JNative.jar是需要導(dǎo)入到Java工程的lib下。 通過Build Path即可導(dǎo)入。 建議將JNative.jar放在jdk的jre\lib\ext文 件里。
JNativeCpp.dll是必須放入到j(luò)dk的jre\bin文件里,否則就會(huì)報(bào)JNative找不到的錯(cuò)誤。
libJNativeCpp.so是Linux操作系統(tǒng)的,由于沒有做過實(shí)驗(yàn),所以暫時(shí)不予說明。
(2):由于 JNativeCpp.dll是32為windows程序,所以需要下載jdk 32位的版本才可以。這一點(diǎn)要注意了
(3):將需要調(diào)用的dll動(dòng)態(tài)鏈接庫放置到system32文件里,否則就會(huì)出現(xiàn)找不到dll文件的錯(cuò)誤。
(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:參數(shù)1.類名
// 2.方法名
jnt = new JNative("SiInterface.dll", "INIT");
jnt.setParameter(0, "error");
// 3.設(shè)置返回參數(shù)的類型
jnt.setRetVal(Type.INT);
// 4.執(zhí)行方法
jnt.invoke();// 調(diào)用方法
}
// 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.釋放系統(tǒng)資源
try {
jnt.dispose();
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
聯(lián)系客服