2011-01-26 90 views
5

從Java程序訪問dll文件,我有一個dll文件,我試圖通過JNA問題通過JNA

通過Java程序調用它的功能,但問題是它是不是能找到我的DLL文件和投擲以下異常:

java.lang.UnsatisfiedLinkError: Unable to load library 'UsbDll': The specified module could not be found. 

at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:163) 
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:236) 
at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:199) 
at com.sun.jna.Native.register(Native.java:1018) 
at com.MainClass.<clinit>(MainClass.java:15) 
Exception in thread "main" 

下面是我的程序:

package com; 

import com.sun.jna.Native 

public class MainClass { 

    static { 
     Native.register("UsbDll"); 
    } 

public native int method(); 

    public static void main(String[] args) { 
    } 
} 

我的DLL文件的名稱是UsbDll.dll和我的操作系統是Windows。

============================ EDITED ================= ===============

我的DLL文件的位置是 「C:\ UsbDll.dll」

當我把另一dll文件在同一位置,JNA找到它,所以我認爲這個問題只與我的「UsbDll.dll」文件有關。

當我試圖用下面的命令

System.load("c:\\UsbDll.dll"); 
System.load("c:\\another.dll"); 

加載dll文件(UsbDll.dll和另一個DLL),它都加載了「another.dll」成功,但對於「UsbDll.dll」它會拋出以下異常:

java.lang.UnsatisfiedLinkError: C:\UsbDll.dll: Can't find dependent libraries 
    at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1803) 
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1699) 
at java.lang.Runtime.load0(Runtime.java:770) 
at java.lang.System.load(System.java:1003) 
at com.MainClass.<clinit>(MainClass.java:16) 

Exception in thread "main" 

Q1。它看起來沒有找到一些依賴庫。但是,因爲我完全陌生的這些DLL,有什麼我失蹤或者我要問的供應商給我提供的依賴庫。

它取決於一些標準庫,我可以從網上下載嗎?如果是,那麼如何找到它所依賴的庫名稱?

============================ EDITED#2 =============== =================

我在我的UsbDll.dll文件上運行Dependency Walker來查找缺失的依賴關係,發現以下缺失的依賴關係。

WER.DLL(由庫WINNM.DLL在我的C發現簡稱:\ Windows \ System32下)

IESHIMS.DLL(由庫WINNM.DLL在我的C發現簡稱:\ Windows \ System32下)

WDAPI920.DLL(由我UsbDll.dll直接簡稱)

Q1。作爲WINNM.DLL在我的system32文件夾下找到,它似乎爲標準DLL。如果這個標準dll是指2倍人失蹤的DLL(WER.DLL & IESHIMS.DLL),那麼我懷疑其他應用程序如何工作誰使用這個WINNM.DLL文件? Q2302。我用Google搜索WDAPI920.dll(這是指直接我UsbDll.dll)等衆多搜索結果中出現了相同的DLL名稱。所以它也看起來像一些標準庫。那麼如何解決這些依賴關係?從哪裏下載它們?下載後,我可以將它們放在我的主dll(UsbDll.dll)所在的同一目錄中,或者我需要做一些額外的加載我的dll(UsbDll.dll)的成功嗎?

+0

'UsbDll.dll'很可能依賴於你的系統中沒有的一些標準模塊(例如,如果它使用ATL,並且如果你沒有正確的運行時間則保證會失敗) 。要解決這個問題,你需要適當的運行環境。 **另外**有可能關注的DLL取決於某個「供應商」特定的模塊。對於您來說,最好的選擇是最快的選擇是聯繫供應商。否則,請嘗試從微軟網站安裝適當的運行時(但更多的是試用版)。 – Favonius 2011-01-26 18:20:17

+0

不知何故,我無法發表評論與鏈接:(。我將它添加爲ans。 – Favonius 2011-01-26 18:27:31

+0

只需嘗試一下,如果下載的DLL修復它,但它會更好地找出哪些軟件提供它,並安裝激動人心的軟件。這可能有助於下載該DLL並查看DLL文件的屬性頁,其中給出了供應商和軟件名稱(或者至少應該用於合理開發的DLL)。 – Daniel 2011-01-26 21:19:43

回答

0

DLL必須在由LD_LIBRARY_PATH(請參閱env)指定的路徑中,或者在JNA的情況下在當前目錄中。

1

從您的編輯代碼很明顯,UsbDll.dll依賴於您的系統中不存在的一些標準模塊(例如,如果它使用ATL,並且如果您沒有適當的運行時間,那麼它肯定會失敗)。要解決這個問題,你需要適當的運行環境。

還有有可能關注的dll取決於某些供應商特定的模塊。對你來說,最好的選擇是(和最快的選擇)聯繫供應商。否則,試圖從微軟網站安裝適當的運行時(但其更多的打了試用版)


更新

使用下面的鏈接查找有關DLL依賴更多:

  1. How do I determine the dependencies of a .NET application?
  2. http://msdn.microsoft.com/en-us/library/ms235265.aspx
  3. Command line tool to find Dll dependencies


更新2

見下文提到的鏈接,缺少DLL的詳細信息(但它是特定的Windows版本)

  1. Dependency Walker reports IESHIMS.DLL and WER.DLL missing?
  2. http://social.msdn.microsoft.com/Forums/en/vsx/thread/6bb7dcaf-6385-4d24-b2c3-ce7e3547e68b

Fro幾個簡單的谷歌查詢,WDAPIXXX.dll似乎是一些勝利驅動相關的事情(雖然我不太確定)。檢查這個鏈接,他們有話要說關於WDAPI http://www.jungo.com/st/support/tech_docs/td131.html