我创建了一个带有visual studio的JNI库,可以在java应用程序中使用,在内部这个dll调用另一个DLL(openssl)。现在当我用eclipse加载这个库时,我得到一个错误说"无法找到依赖库"除非我把另一个DLL的路径放在PATH变量上。
in thread "main" java.lang.UnsatisfiedLinkError: C:\*****\jniDLL.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at iwinAlgTest.test.<clinit>(test.java:7)
我已经尝试将它添加到-Djava.library.path和类路径中,我还包括我所有的dll和openssl dll和lib文件,例如libeay32.lib,但都没有用。有没有办法做到这一点? 我尝试使用Dependency Walker来检查我的jniDLL.dll是否需要任何文件 但我觉得有趣的事情: 我真正做的是创建我的jniDLL:
(jniDLL --> calls myDLL.dll) ==> (myDLL.dll --> calls openssl library)
但Dependency Walker说
(jniDLL --> depends on myDLL.exe) not myDLL.dll
注意:首先它是一个win32应用程序(输出myDLL.exe)但是我将项目设置更改为输出myDLL.dll然后我创建了另一个项目来创建一个来自myDLL.dll的JNI dll我用c ++写的< / p>
答案 0 :(得分:1)
绕过此方法的一种方法是在加载myDLL之前加载openssl.dll,这样myDLL会在尝试启动时找到加载的符号。
解决此问题的其他方法:
然而,这仅适用于Windows。
在linux中,你必须更改.so中的rpath(但我相信这超出了范围)。