【问题标题】:Trying to use DLL from Java (JNA). Unable to load library exception尝试使用来自 Java (JNA) 的 DLL。无法加载库异常
【发布时间】:2013-01-11 21:07:01
【问题描述】:

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

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

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

【问题讨论】:

  • 请检查simpleDLL是32位还是64位。然后检查 JVM 是 32 位还是 64 位。它们必须用于同一个平台。
  • 尝试使用另一个 dll 和 JNI。似乎有效

标签: java dll jna


【解决方案1】:

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

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

【讨论】:

  • 我在public static void main(String[] args) {之后使用了这个代码。我的图书馆位于 user.dir 中。结果相同 - 异常
  • Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Windows\System32\simpleDLL.dll: Can't find dependent libraries
  • 它不在你的user.dir中,user.dir是java程序所在的路径,除非你把它放在C:\Windows\System32\你没有你的dll在用户目录中
  • 我尝试评论所有“主要”代码并将其替换为:System.loadLibrary("simpleDLL"); 它说:Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load IA 32-bit .dll on a AMD 64-bit platform 这意味着 dll 已找到但它不能被加载,因为我有一台 x64 机器,它不适用于您链接的站点中的示例,但使用 System.loadLibrary 它可以工作。我建议您尝试使用 JNI 而不是 JNA 实现 DLL,我一直使用 JNI,并且在 DLL 链接方面没有问题
  • 另外,另一方面,这对我不起作用。我遵循了您的所有步骤,还添加了额外的System.setProperty("jna.library.path", dir);dir 是绝对路径 (D:\programs\...)。肯定还有一个问题可能发生。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回复!用 Cygwin 命令“file”检查了 simpleDLL,这个 dll 是 32 位的,我也有 32 位的机器。
  • 用绝对路径试过,结果相同
【解决方案3】:

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

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

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

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

Dependency Walker

【讨论】:

    【解决方案4】:

    这个问题的三个可能原因,如果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,我们可以解决这个问题。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 2015-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        相关资源
        最近更新 更多