我正在制作一个程序使用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"
请你给我一些帮助吗?
答案 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.dll
)C:\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位应用程序。