使用 JNA (Java Native Access) 呼叫原生 DLL 時,若遇到 java.lang.UnsatisfiedLinkError: Unable to load library 'xxx': Native library (win32-x86-64/ID_Fpr.dll),核心原因在於 DLL 位數與 JVM 位數不匹配。典型情況為:DLL 為 32 位 (x86),而運行環境為 64 位 JVM (x86-64)。JVM 只能載入與自身架構一致的原生庫。
安裝並配置 32 位版本的 JDK/JRE 運行應用程式,確保 JVM 架構與 DLL 一致。這是解決此類問題最根本的方式。
若 DLL 架構正確,但路徑未被識別,可透過程式碼動態設定 java.library.path:
String myLibraryPath = System.getProperty("user.dir"); // 或指定 DLL 所在絕對路徑
System.setProperty("java.library.path", myLibraryPath);
// 重新初始化 sys_paths 欄位 (需反射,因為該欄位為 private static)
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
fieldSysPath.set(null, null);
// 載入庫 (不帶副檔名)
System.loadLibrary("libraryWithoutDLLExtension");
或直接使用 System.load("完整絕對路徑/庫文件名.dll") 載入指定路徑下的 DLL。
Native library (win32-x86-64/xxx.dll):明確提示 JVM 正在 64 位路徑下尋找,但 DLL 可能為 32 位,導致架構不匹配。Native library (win32-x86/xxx.dll):提示在 32 位路徑下找不到 DLL 文件本身,屬於路徑缺失問題,非架構衝突。java -version 輸出中包含 "64-Bit" 即為 64 位)。java.library.path 或系統 PATH 環境變數覆蓋的路徑中。參考資源:StackOverflow 相關討論