通过JNA从Java程序访问dll文件时出现问题

时间:2011-01-26 14:03:33

标签: java jna nativelibrary

我有一个dll文件,我试图通过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”文件中。

当我尝试使用以下命令加载dll文件(UsbDll.dll和另一个dll)时

System.load("c:\\UsbDll.dll");
System.load("c:\\another.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完全陌生,有什么我缺少的,或者我需要请求供应商为我提供依赖库。

OR

这取决于我可以从互联网上下载的一些标准库吗?如果是,那么如何找到它所依赖的库名?

============================编辑#2 ================ ================

我在我的UsbDll.dll文件上运行Dependency Walker以查找缺少的依赖项,并发现以下缺少的依赖项。

WER.DLL (由我的c:\ windows \ system32中的库 WINNM.DLL 引用)

IESHIMS.DLL (在我的c:\ windows \ system32中找到的库 WINNM.DLL 引用)

WDAPI920.DLL (由我的UsbDll.dll直接引用)

Q1。由于在我的system32文件夹中找到了WINNM.DLL,它似乎是标准的dll。如果这个标准的dll指的是2个缺少的dll(WER.DLL和IESHIMS.DLL),那么我怀疑其他应用程序是如何使用这个WINNM.DLL文件的?

Q2。我用Google搜索了WDAPI920.dll(直接引用了我的UsbDll.dll),许多搜索结果都出现了相同的dll名称。所以它看起来也像是一些标准库。那么如何解决这些依赖关系呢?从哪里下载?下载后,我可以将它们放在我的主dll(UsbDll.dll)所在的目录中,或者我需要做一些额外的操作才能成功加载我的dll(UsbDll.dll)吗?

2 个答案:

答案 0 :(得分:1)

从您编辑的代码中可以看出,UsbDll.dll依赖于系统中没有的某些标准模块(例如,如果它使用ATL并且如果您没有正确的运行时那么它是保证失败)。要解决此问题,您需要适当的运行时环境。

有关的dll可能取决于某些供应商特定的模块。对您而言,最好的选择是(并且最快的选择)与供应商联系。否则,尝试从microsoft站点安装适当的运行时(但更多的是命中和试用)

<小时/> 的更新

使用以下链接查找有关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
  4. <小时/> 更新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
    3. 从几个简单的谷歌查询中,WDAPIXXX.dll似乎是一些胜利的驱动程序相关的事情(虽然我不太确定)。查看此链接,他们可以对WDAPI http://www.jungo.com/st/support/tech_docs/td131.html进行评论。

答案 1 :(得分:0)

DLL必须在LD_LIBRARY_PATH指定的路径中(参见您的env),或者在JNA的情况下,在当前目录中。