[英]How to build JNI DLL that calls function from another DLL? - JNI, Gradle
[英]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在嘗試啟動時會找到已加載的符號。
解決此問題的其他方法:
但是,這僅適用於Windows。
在linux中,您將必須更改.so內的rpath(但是我認為這超出了范圍)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.