2017-03-01 158 views
0

我正在研究Eclipse上的Java項目,該項目通過JNI使用C++ OpenCV庫。一些圖像處理算法在本機端用OpenCV實現,我希望通過JNI使用它們。如何解決「java.lang.UnsatisfiedLinkError:無法找到依賴庫」沒有System32?

我已經構建了一個C++ DLL項目來鏈接到Java,這導致了MyLibrary.dll文件。我使用GCC 6.3編譯器編譯OpenCV,並在Eclipse CDT上使用相同的GCC 6.3編譯器編譯C++代碼(以及MinGW Linker)。我還檢查了是否有使用Dependency Walker的任何依賴性問題。到目前爲止我沒有錯誤。

之後,我試圖從Java代碼加載庫如下:
System.loadLibrary("MyLibrary")

我已經設置與-Djava.library.path=path\to\MyLibrary的路徑,並確保該JVM知道本機庫的地址。我還在MyLibrary.dll旁邊添加了所需的OpenCV庫。

不過,我得到以下錯誤:

Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries 
at java.lang.ClassLoader$NativeLibrary.load(Native Method) 
at java.lang.ClassLoader.loadLibrary0(Unknown Source) 
at java.lang.ClassLoader.loadLibrary(Unknown Source) 
at java.lang.Runtime.loadLibrary0(Unknown Source) 
at java.lang.System.loadLibrary(Unknown Source) 
... 

然後問題消失了,當我移動相關的OpenCV庫到System32文件夾。

我的問題是;我怎樣才能解決這個問題而不移動所需的DLL文件到System32文件夾?

回答

1

此問題的最佳做法是加載自己依賴庫與調用庫加載方法:

System.loadLibrary("opencv_1"); 
System.loadLibrary("opencv_2"); 
... 

加載依賴函數庫後,現在你可以放心地加載自己的DLL文件,以同樣的方式:

System.loadLibrary("MyFile"); 

這應該可以解決can't file dependent libraries錯誤。

另一個解決方法(沒有最佳實踐)是將依賴的dll文件(在你的情況下opencv dll)複製到System32文件夾。

爲什麼會發生這種情況?

我認爲,當您設置java.library.path參數時,您有責任加載庫的相關庫,而不是操作系統本身。我不確定是否誠實。

How to fix an UnsatisfiedLinkError (Can't find dependent libraries) in a JNI project 中所述,您可以通過將-XshowSettings:properties -version參數添加到虛擬機來檢查路徑。

+0

@isacikgoz謝謝,這就像一個魅力。 –

+0

@isacikgoz現在看起來很明顯,但是當錯誤信息一直說:「找不到依賴庫」時,我不知道還有其他庫需要加載。我使用DLL依賴關係walker來查找相關的庫,並根據您的建議加載它們,現在它可以工作!謝謝。 – KSK

相關問題