JNI DLL的依赖关系,它在内部调用另一个DLL



我已经用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(但我相信这超出了范围)。

最新更新