Java程序引用C寫的DLL動態庫,出現如下錯誤:【java.lang.UnsatisfiedLinkError: 找不到指定的模塊。】網上查詢有三種可能導致此錯誤。
一、JDK版本問題。JDK64位對應DLL文件64位,JDK32位對應DLL文件32位。我的DLL是32位的,Windows系統是64位的,安裝了JDK64位的版本和JDK32位的版本(兼容性考慮)。運行Java程序是在32位JDK上面進行的,這點可以通過java -d32 -version命令來獲得證實:
C:\Users\Andy>java -d32 -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)
如果當前Java是64位的JDK,上述命令會報錯。
二、DLL路徑有問題,比如絕對路徑寫錯了。其實我引用DLL一直用相對路徑,就是直接寫DLL的文件名,然后把此DLL放到CLASSPATH之中,從來沒出問題過。
因為此問題的出現,我改寫成絕對路徑,結果新的錯誤出來了:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'C:\Work\helloworld\WebContent\WEB-INF\classes\TEST.dll':
Native library (win32-x86/D:\Work\helloworld\WebContent\WEB-INF\classes\TEST.dll) not found in resource path
([file:/D:/Work/helloworld/WebContent/WEB-INF/classes/......)
更何況,絕對路徑就是拷貝粘貼的事兒,幾乎不會出錯;甚至通過
System.out.println(System.getProperty("java.library.path"));
命令檢測,將DLL放置於指定目錄(比如說JDK的BIN目錄),問題同樣出現;所以,問題不在這兒。
三、DLL文件依賴問題。
可以用depends.exe工具檢測DLL文件的相關依賴。下載地址(官網):http://www.dependencywalker.com/,可以選擇下載安裝32位版的,或者是64位版本的。
運行工具對DLL進行檢測,發覺確實少了依賴包。
下載相關包安裝即可。我這里,是安裝【微軟常用運行庫合集-2021.04.07-X64.exe】,問題得到解決。