寫在前面:最近碰到個項目,客戶是搞C語言的,需求要在項目中開放接口調(diào)用現(xiàn)成的dll文件
然后去了解了下Java中調(diào)用dll的幾種方式,總的有三種:JNI、JNA、JNative。其中JNA調(diào)用DLL是最方便的。
注意:要調(diào)用的DLL位數(shù)要與JDK位數(shù)相同,若dll為32位則jdk也要32位的,若dll為64位的,則jdk為64位的,否則無法調(diào)用。
·JNI

image
·JNA

image
·JNative

image
java使用 JNI來調(diào)用dll動態(tài)庫的調(diào)用,工作量略大,一般情況下開發(fā)人員會選用JNA或JNative。
使用JNative調(diào)用DLL除了要引入jar包外還需要額外引入一個dll文件,而JNA只需要引入jar即可使用。
代碼示例
本代碼示例基于 64位 win10
添加需要的依賴
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.3.1</version>
</dependency>
// c++ 需要在 vs 中編譯成 dll
int AddXY(int x, int y) {
return x+y;
}
Java代碼
public interface CLibrary extends Library {
// DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑
// CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
// CLibrary.class);
// 下面目錄是我本地測試文件路徑
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("C:\\Users\\zl\\Desktop\\Dll2_x64", CLibrary.class);
// 聲明將要調(diào)用的DLL中的方法(可以是多個方法)
int AddXY(int x, int y);
}
public static void main(String[] args) {
int xy = CLibrary.INSTANCE.AddXY(2, 3);
System.out.println(xy);
}
運行結(jié)果:

image.png
完整代碼如下:
package com.redis.lock.demo.dll;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.win32.StdCallLibrary;
/**
* JNA框架DLL動態(tài)庫讀取調(diào)用示例類
*
* @ClassName: DllCall
* @Description: 讀取調(diào)用DLL動態(tài)庫文件中的方法
* @author: zl
* @date: 2020年05月26日 下午11:08:16
*/
public class JNADllCall {
/**
* DLL動態(tài)庫調(diào)用方法1
*
* @Description: 讀取調(diào)用StdCall方式導出的DLL動態(tài)庫方法
* @author: zl
* @date: 2020年05月26日 下午11:08:16
*/
public interface StdCallDll extends StdCallLibrary {
// DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑
StdCallDll INSTANCE = (StdCallDll) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
StdCallDll.class);// 加載動態(tài)庫文件
// 聲明將要調(diào)用的DLL中的方法(可以是多個方法)
void printf(String format, Object... args);
}
/**
* DLL動態(tài)庫調(diào)用方法2
*
* @Description: 讀取調(diào)用Decl方式導出的DLL動態(tài)庫方法
* @author: zl
* @date: 2020年05月26日 下午11:08:16
*/
public interface CLibrary extends Library {
// DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑
// CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
// CLibrary.class);
// 下面目錄是我本地測試文件路徑
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("C:\\Users\\zl\\Desktop\\Dll2_x64", CLibrary.class);
// 聲明將要調(diào)用的DLL中的方法(可以是多個方法)
int AddXY(int x, int y);
}
public static void main(String[] args) {
int xy = CLibrary.INSTANCE.AddXY(2, 3);
System.out.println(xy);
}
}
以上簡單記錄java通過JNA框架調(diào)用DLL動態(tài)庫的步驟,若需要進一步了解可參考以下博文地址:http://www.itdecent.cn/p/ead89497c403