2011-01-26 47 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