【问题标题】:load dll error while using System.loadLibrary()使用 System.loadLibrary() 时加载 dll 错误
【发布时间】:2012-03-07 02:31:54
【问题描述】:

我正在制作一个程序,使用 JNI 来调用一些本机指令。我的代码是:System.loadLibrary("poc_NativeShellExecutor");

当我运行代码时,我得到了异常:

Caused by: java.lang.UnsatisfiedLinkError: no poc_NativeShellExecutor in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:845) at java.lang.System.loadLibrary(System.java:1084)

我检查了java.library.path,我确定我确实将 poc_NativeShellExecutor.dll 放在了 C:\Windows\System32 中。 这是我的系统的一些信息:

Java version: 1.7.0_03, vendor: Oracle Corporation
Java home: E:\Program Files (x86)\Java\jdk1.7.0_03\jre
Default locale: en_US, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "x86", family: "windows"

你能给我一些帮助吗?

【问题讨论】:

  • 那么您究竟java.library.path 设置为什么?如果没有设置,Java 会使用PATH;这实际上包括system32 目录吗?
  • Program Files (x86) 文件夹意味着您在 64 位操作系统上使用 32 位 JVM。您的poc_NativeShellExecutor.dll 是 64 位 DLL 吗?如果是这样,您要么需要重新编译它,要么切换到 64 位 JVM:32 位进程无法加载 64 位 DLL。
  • 欧内斯特,system32目录确实存在于PATH变量中。
  • @eee 实际上,将本机库放在应用程序路径下是我通常做的事情,这是我的首选方式。它一直有效。我不喜欢干涉操作系统的系统文件夹。
  • @DanielPryden 非常感谢,我尝试了 Dependecy Walker 并在加载我的 DLL 时发现了一些错误。它们是我的 32 位 DLL 和 64 位 sys DLL 之间的一些不兼容问题。但奇怪的是,我的程序可以在它的根路径中使用 DLL 正常工作。

标签: java dll java-native-interface


【解决方案1】:

这不是解决方案,而是额外的数据,我希望可以帮助找到一个。

我和 OP 有同样的问题。

我的系统是Windows7 Ultimate x64 SP1
我使用 32 位 jvm 1.6.0_29 运行我的 32 位 test_x86.dll

我已尝试将test_x86.dll 放在以下文件夹中:

C:\
C:\Windows
C:\Program Files (x86)

它工作正常:我的test_x86.dll 已成功加载。

但如果我将我的 dll 放入

C:\Windows\System32

我得到了例外:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no test_x86 in java.library.path

我每次尝试加载dll之前都会更改我的java.library.path,所以它总是从相应的目录开始:

java.library.path = C:/;C:\Program Files (x86)\Java\jre6\bin; ...
java.library.path = C:/Windows;C:\Program Files (x86)\Java\jre6\bin; ...
java.library.path = C:/Program Files (x86);C:\Program Files (x86)\Java\jre6\bin; ...
java.library.path = C:/Windows/System32;C:\Program Files (x86)\Java\jre6\bin; ...

我还尝试在C:\Windows\System32 中使用默认java.library.path(默认包含C:\Windows\System32)和test_x86.dll。不走运:它也会导致上述异常。

我总是在java.library.path 中的文件夹中拥有test_x86.dll 的单个副本,即一次只有一个文件夹包含该文件。

结论:

似乎在 Windows 7 x64 中,C:/Windows/System32 有一些棘手的限制。

早些时候在我的 Windows XP 32 位机器上,我从不担心 C:\Windows\System32 文件夹和 java.library.path 的变化。我只是在该文件夹中使用System.loadLibrary("test_x86"); 调用和test_x86.dll,它总是有效。

【讨论】:

  • +1,感谢分享。谁会想到 System32 对图书馆来说不是个好地方?
  • 问题是 C:\Windows\System32 将适用于 64 位 DLL。如果您将 test_x86.dll 放在 C:\Windows\SysWOW64 中,它会起作用。
【解决方案2】:

如果您从 32 位应用程序引用 64 位 Windows 上的 C:\Windows\System32,Windows 实际上会在 C:\Windows\SysWOW64 中搜索。您必须将 32 位应用程序的 dll 放在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    相关资源
    最近更新 更多