【问题标题】:dependency of a JNI DLL which internally calls another dll内部调用另一个 dll 的 JNI DLL 的依赖关系
【发布时间】:2014-09-15 19:00:32
【问题描述】:

我已经创建了一个带有 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 以及 libeay32.lib 等 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++ 编写的

【问题讨论】:

  • and lib files like libeay32.lib 在运行时不使用库文件。它们仅在构建过程中使用。将 DLL 添加到 PATH 环境变量指定的路径中,看看是否能解决问题。如果将新目录添加到 PATH,则可能需要重新启动 Eclipse 才能生效。

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


【解决方案1】:

绕过此问题的一种方法是在加载 myDLL 之前加载您的 openssl.dll,以便 myDLL 在尝试启动时找到加载的符号。

解决此问题的其他方法:

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

但这仅适用于 Windows。

在 linux 中,您必须更改 .so 中的 rpath(但我认为这超出了范围)。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2015-07-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多