首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

解決 java.lang.UnsatisfiedLinkError: JNA 載入 32 位 DLL 於 64 位 JVM 失敗問題

     編輯:Java 綜合教學

解決 java.lang.UnsatisfiedLinkError: JNA 載入 32 位 DLL 於 64 位 JVM 失敗問題

錯誤現象與根因

使用 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 位 JVM (最直接有效)

安裝並配置 32 位版本的 JDK/JRE 運行應用程式,確保 JVM 架構與 DLL 一致。這是解決此類問題最根本的方式。

方案二:正確配置 Java Library Path

若 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 文件本身,屬於路徑缺失問題,非架構衝突。

關鍵檢查清單

  1. 確認 DLL 為 32 位還是 64 位 (可用 Dependency Walker 等工具檢視)。
  2. 確認運行程式的 JVM 位數 (java -version 輸出中包含 "64-Bit" 即為 64 位)。
  3. 兩者必須一致:32 位 DLL 需 32 位 JVM,64 位 DLL 需 64 位 JVM。
  4. 確保 DLL 及其依賴的所有其他 DLL 都在 java.library.path 或系統 PATH 環境變數覆蓋的路徑中。

參考資源:StackOverflow 相關討論

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved