使用System.loadLibrary()时加载DLL错误

时间:2012-03-07 02:31:55

标签: java dll java-native-interface

我正在制作一个程序使用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"

请你给我一些帮助吗?

2 个答案:

答案 0 :(得分:3)

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

我和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; ...

我还尝试在java.library.path中使用默认C:\Windows\System32(默认情况下包含test_x86.dllC:\Windows\System32。没有运气:它也导致上述例外。

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

结论:

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

早在我的Windows XP 32位计算机上,我从未担心C:\Windows\System32文件夹和java.library.path更改。我只是在该文件夹中使用了System.loadLibrary("test_x86");test_x86.dll的通话,而且它始终有效。

答案 1 :(得分:1)

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