【问题标题】:Why do I get java.lang.UnsatisfiedLinkError: Unable to load library?为什么我得到 java.lang.UnsatisfiedLinkError: Unable to load library?
【发布时间】:2013-07-17 11:25:41
【问题描述】:

我正在尝试使用 JNA 从我的 Java 应用程序调用 .dll 文件。我收到以下异常:

线程“主”java.lang.UnsatisfiedLinkError 中的异常:无法加载库“C:\Windows\System32\foo.dll”:找不到指定的模块。

.dll 和我的 jdk 都是 32 位 (OS_ARCH="i586") 虽然我在 64 位 Windows 7 PC 上运行它。
.dll 位于 System32 文件夹中。

我正在使用 Eclipse,并已将 System32 文件夹添加到 Java 构建路径属性中“库”选项卡下 JRE 系统库中的本机库位置(尽管我认为这不是必需的)。

如果有任何帮助或建议,我将不胜感激。
谢谢,
-蒙克。

【问题讨论】:

    标签: java windows jna


    【解决方案1】:

    这取决于file system redirector。您在模拟 64 位系统上的 32 位 Windows 的 WOW64 模拟器下执行。在 WOW64 下,system32 被重定向到 SysWOW64。您需要将 DLL 放在那里。

    话虽如此,系统目录归系统所有,并且是系统私有的。您不应将 DLL 放入系统目录。您应该找到一种方法将您的 DLL 放在其他位置。

    【讨论】:

    • 我正试图让这个 .dll 在处理环境中正常工作,但没有太多乐趣。我已经发布了一个新线程here,如果您有任何回复,我将不胜感激。感谢 @David-Heffernan 对此主题的回复。
    【解决方案2】:

    另一个错误原因是 dll 仅支持 32 版本而不支持 64 位操作系统。您必须确认 dll 供应商。

    【讨论】:

    • 这几乎不可能。如果是真的,32 位 Java 将如何执行?
    【解决方案3】:

    我的操作系统是windows-x64,我的jdk是x64。所以问题和你一样。 我的解决办法是你必须安装jdk-x86,然后把你的dll放到jdk-x86/bin目录下。

    【讨论】:

    • 我不认为在这里安装 jkd-x86 是强制性的。将 dll 放入任何定义为系统路径一部分的目录就足够了。
    【解决方案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,我们可以解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2016-03-21
      • 1970-01-01
      • 2012-05-17
      • 2015-07-18
      • 1970-01-01
      • 2016-08-20
      相关资源
      最近更新 更多