簡體   English   中英

內部調用另一個dll的JNI DLL的依賴關系

[英]dependency of a JNI DLL which internally calls another 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.path和classpath中,並且我還包含了所有的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,然后我創建了另一個項目,以用c ++編寫的myDLL.dll創建JNI dll。

一種繞過此方法的方法是在加載myDLL之前加載openssl.dll,因此myDLL在嘗試啟動時會找到已加載的符號。

解決此問題的其他方法:

  • 將openssl.dll添加到PATH(您已經提到過)
  • 在安裝時復制system32中的openssl
  • 將openssl與可執行路徑放在同一文件夾中

但是,這僅適用於Windows。

在linux中,您將必須更改.so內的rpath(但是我認為這超出了范圍)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM