尝试使用Java(JNA)中的DLL。无法加载库异常

问题描述 投票:11回答:5

我有来自tutorial的NetBeans项目导致异常:

线程“main”中的异常java.lang.UnsatisfiedLinkError: Unable to load library'simpleDLL':找不到指定的模块。

试图将simpleDLL.dll放在项目库中,在system32文件夹中复制文件没有成功。

java dll jna
5个回答
12
投票

我在加载DLL时遇到了同样的问题,我用这种方式解决了它:

  • 正如Christian Kuetbach所说,检查你使用的simpleDLL是否与你的处理器架构兼容,32位DLL不能在64位机器上运行,而且64位DLL也不适用于32-钻头机。
  • 如果DLL兼容,那么问题可能出在您的java库路径中。我将我的DLL放入user.dir目录,然后我使用了这段代码: 将Java库路径设置为user.dir或者您想要的其他路径: String myLibraryPath = System.getProperty("user.dir");//or another absolute or relative path System.setProperty("java.library.path", myLibraryPath); 加载库: 的System.loadLibrary( “libraryWithoutDLLExtension”);

它对我有用,尝试并告诉我它是否适合你。


5
投票

请检查simpleDLL是32位还是64位。然后检查,如果JVM也是32位或64位。他们必须是同一个平台。

如果将loadLibrary()更改为load(),您也可以指定绝对路径:http://www.chilkatsoft.com/p/p_499.asp


2
投票

我只能运行32位(Xp)。

将DLL放在“c:\ Windows \ System32”文件夹中

helloWorldDLL lib =(helloWorldDLL)Native.loadLibrary(“helloworldDLL”,helloWorldDLL.class);

如果错误java.lang.UnsatisfiedLinkError:无法加载库“持久存在,请使用Dependency Walker查看依赖的DLL。

Dependency Walker


1
投票

如果dll文件没有被破坏,这个问题有三个可能的原因:

  1. 32位64位兼容性。 32位dll只能在32位jdk或jre上运行。通过使用Cygwin命令file <filename>,我们可以判断dll是32位还是64位。
  2. dll没有在正确的路径中被覆盖,因此java无法找到它。一般来说,我们可以使用除System32之外的一些绝对路径来确保路径正确。
  3. 我们正在加载的DLL需要其他dll。

我们如何处理第三种可能性:

  1. 与JNA相比,使用JNI的System.loadLibrary()方法可以给我更多暗示。它可能会说:Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries.这意味着缺少一些MyLibrary.dll依赖的库。通过使用dependency walker我们可以知道需要什么dll。
  2. 通过在我们想要加载的dll之前加载这些dll,我们可以解决这个问题。

0
投票

有同样的问题,由于某些原因,即使dll文件名有大写字母,你必须使用如下所有的小写字母加载它:Native.loadLibrary("dlls/library.dll", YourInterface.class)

不是这个:Native.loadLibrary("dlls/Library.dll", YourInterface.class)

© www.soinside.com 2019 - 2024. All rights reserved.