從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)的成功嗎?
'UsbDll.dll'很可能依賴於你的系統中沒有的一些標準模塊(例如,如果它使用ATL,並且如果你沒有正確的運行時間則保證會失敗) 。要解決這個問題,你需要適當的運行環境。 **另外**有可能關注的DLL取決於某個「供應商」特定的模塊。對於您來說,最好的選擇是最快的選擇是聯繫供應商。否則,請嘗試從微軟網站安裝適當的運行時(但更多的是試用版)。 – Favonius 2011-01-26 18:20:17
不知何故,我無法發表評論與鏈接:(。我將它添加爲ans。 – Favonius 2011-01-26 18:27:31
只需嘗試一下,如果下載的DLL修復它,但它會更好地找出哪些軟件提供它,並安裝激動人心的軟件。這可能有助於下載該DLL並查看DLL文件的屬性頁,其中給出了供應商和軟件名稱(或者至少應該用於合理開發的DLL)。 – Daniel 2011-01-26 21:19:43