簡體   English   中英

嘗試使用來自 Java (JNA) 的 DLL。 無法加載庫異常

[英]Trying to use DLL from Java (JNA). Unable to load library exception

我有來自教程的NetBeans 項目,這會導致異常:

線程“main”中的異常java.lang.UnsatisfiedLinkError: Unable to load library “simpleDLL”:找不到指定的模塊。

試圖將 simpleDLL.dll 放在項目庫中,將文件復制到 system32 文件夾中,但沒有成功。

我在加載 DLL 時遇到了完全相同的問題,我是這樣解決的:

  • 正如 Christian Kuetbach 所說,檢查您使用的 simpleDLL 是否與您的處理器架構兼容,32 位 DLL 無法在 64 位機器上運行,64 位 DLL 也無法在 32 位機器上運行位機。

  • 如果 DLL 兼容,則問題可能出在您的 java 庫路徑中。 我將我的 DLL 放入user.dir目錄中,然后我使用了以下代碼:

    將 Java 庫路徑設置為user.dir或者您想要的其他路徑:

     String myLibraryPath = System.getProperty("user.dir");//or another absolute or relative path System.setProperty("java.library.path", myLibraryPath);

    加載庫:

     System.loadLibrary("libraryWithoutDLLExtension");

它對我有用,嘗試一下,然后告訴我它是否適合你。

請檢查 simpleDLL 是 32 位還是 64 位。 然后檢查 JVM 是否也是 32 位或 64 位。 它們必須用於同一個平台。

如果您將loadLibrary()更改為load() ,您也可以指定絕對路徑: http : //www.chilkatsoft.com/p/p_499.asp

我只能在 32 位 (Xp) 下運行。

將 DLL 放在文件夾“c:\\Windows\\System32”中

helloWorldDLL lib = (helloWorldDLL) Native.loadLibrary("helloworldDLL", helloWorldDLL.class);

如果錯誤 java.lang.UnsatisfiedLinkError: Unable to load library" 仍然存在,請使用 Dependency Walker 查看依賴的 DLL。

依賴行者

如果dll文件沒有損壞,則此問題的三個可能原因:

  1. 32 位 64 位兼容性。 32 位 dll 只能在 32 位 jdk 或 jre 上運行。 通過使用 Cygwin 命令file <filename>我們可以判斷一個 dll 是 32 位還是 64 位。

  2. dll 沒有在正確的路徑中,所以 java 無法找到它。 一般來說我們可以使用System32以外的一些絕對路徑來保證路徑正確。

  3. 我們正在加載的 dll 需要其他 dll。

我們如何處理第 3 種可能性:

  1. 與 JNA 相比,使用 JNI 的System.loadLibrary()方法可以給我更多提示。 它可能會這樣說: Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries. 這意味着缺少MyLibrary.dll依賴的某些庫。 通過使用dependency walker,我們可以知道需要哪些dll。

  2. 通過在我們要加載的 dll 之前加載這些 dll,我們可以解決這個問題。

有同樣的問題,由於某種原因,即使 dll 文件名有大寫字母,你也必須使用所有小寫字母加載它,如下所示: Native.loadLibrary("dlls/library.dll", YourInterface.class)

不是這個: Native.loadLibrary("dlls/Library.dll", YourInterface.class)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM