内部调用另一个dll的JNI DLL的依赖项

时间:2014-07-24 09:31:41

标签: java c++ eclipse dll java-native-interface

我创建了一个带有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>

1 个答案:

答案 0 :(得分:1)

绕过此方法的一种方法是在加载myDLL之前加载openssl.dll,这样myDLL会在尝试启动时找到加载的符号。

解决此问题的其他方法:

  • 将openssl.dll添加到PATH(您已经提到过这个)
  • 在安装时在system32中复制openssl
  • 将openssl放在与可执行路径相同的文件夹中

然而,这仅适用于Windows。

在linux中,你必须更改.so中的rpath(但我相信这超出了范围)。