我有一个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)吗?
答案 0 :(得分:1)
从您编辑的代码中可以看出,UsbDll.dll
依赖于系统中没有的某些标准模块(例如,如果它使用ATL并且如果您没有正确的运行时那么它是保证失败)。要解决此问题,您需要适当的运行时环境。
有关的dll可能取决于某些供应商特定的模块。对您而言,最好的选择是(并且最快的选择)与供应商联系。否则,尝试从microsoft站点安装适当的运行时(但更多的是命中和试用)
<小时/> 的更新强>
使用以下链接查找有关DLL依赖关系的更多信息:
<小时/> 更新2
请参阅下面提到的链接,了解缺少的dll详细信息(但它特定于Windows版本)
从几个简单的谷歌查询中,WDAPIXXX.dll
似乎是一些胜利的驱动程序相关的事情(虽然我不太确定)。查看此链接,他们可以对WDAPI http://www.jungo.com/st/support/tech_docs/td131.html进行评论。
答案 1 :(得分:0)
DLL必须在LD_LIBRARY_PATH指定的路径中(参见您的env),或者在JNA的情况下,在当前目录中。