繁体   English   中英

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

[英]Trying to use DLL from Java (JNA). Unable to load library exception

我有来自教程的NetBeans 项目,这会导致异常:

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

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

我在加载 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");

它对我有用,尝试一下,然后告诉我它是否适合你。

请检查 simpleDLL 是 32 位还是 64 位。 然后检查 JVM 是否也是 32 位或 64 位。 它们必须用于同一个平台。

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

我只能在 32 位 (Xp) 下运行。

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

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

如果错误 java.lang.UnsatisfiedLinkError: Unable to load library" 仍然存在,请使用 Dependency Walker 查看依赖的 DLL。

依赖行者

如果dll文件没有损坏,则此问题的三个可能原因:

  1. 32 位 64 位兼容性。 32 位 dll 只能在 32 位 jdk 或 jre 上运行。 通过使用 Cygwin 命令file <filename>我们可以判断一个 dll 是 32 位还是 64 位。

  2. dll 没有在正确的路径中,所以 java 无法找到它。 一般来说我们可以使用System32以外的一些绝对路径来保证路径正确。

  3. 我们正在加载的 dll 需要其他 dll。

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

  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,我们可以解决这个问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM