1.JNA框架
a.定義:JNA(Java Native Access)框架是一個開源的Java框架,是SUN公司主導開發的,建立在經典的JNI的基礎之上的一個框架
b.作用:JNA提供一組Java工具類用於在運行期動態訪問系統本地庫(native library:如Window的dll)而不需要編寫任何Native/JNI代碼。開發人員只要在一個java接口中描述目標native library的函數與結構,JNA將自動實現Java接口到native function的映射。
c.導入maven依賴
<dependencies> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.3.1</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.3.1</version> </dependency> ...... </dependencies>
2.調用系統自帶動態鏈接庫
public class TestPrintf { public interface CLibrary extends Library { // DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑 CLibrary INSTANCE = (CLibrary) Native.load((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class); // 聲明將要調用的DLL中的方法(可以是多個方法) void printf(String format, Object... args); } public static void main(String[] args) { CLibrary.INSTANCE.printf("Hello, World\n"); for (int i=0;i < args.length;i++) { CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]); } } }
3.調用自定義dll
a.在VC2019中創建新項目,命名為TestDll1
b.創建頭文件 test.h
#pragma once #define MYLIBAPI extern "C" _declspec(dllexport) MYLIBAPI int sum(int a, int b);
c.創建源文件 test.cpp
#include "pch.h" #include "test.h" #include <stdio.h> int sum(int a, int b) { return a + b; }
d.在工具欄選擇x64(32位則選擇x86)
e.點擊項目TestDll1,右鍵選擇“生成”,生成dll
f.將生成的dll放入resource中
g.創建測試類
public class TestDll { public interface TestDllLib extends Library { // DLL文件默認路徑為項目根目錄,若DLL文件存放在項目外,請使用絕對路徑 TestDllLib INSTANCE = (TestDllLib) Native.load("TestDll1", TestDllLib.class); // 聲明將要調用的DLL中的方法(可以是多個方法) int sum(int a, int b); } public static void main(String[] args) { int result = TestDll.TestDllLib.INSTANCE.sum(2, 3); System.out.println("result: " + result); } }
h.注意:運行前需要用maven執行 clean package,保證 dll 打包進 target 中,不然可能報無法找到dll的錯誤
i.JNA數據類型對應關系
i.參考文檔:https://blog.csdn.net/shendl/article/details/3589676