我已经用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。路径和类路径,我还包括我所有的DLL和openssl DLL和lib文件,如libay32。但都不起作用。有办法做到这一点吗?我尝试使用依赖沃克来检查是否有我的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++
绕过此问题的一种方法是在加载myDLL之前加载openssl.dll,这样myDLL将在尝试初始化时找到加载的符号。
其他方法:
- 将openssl.dll添加到PATH(您已经提到过了)
- 在system32中拷贝openssl
- 将openssl放在与可执行路径相同的文件夹
这只适用于Windows。
在linux中,您必须更改。so中的rpath(但我相信这超出了范围)。