2013-03-20 60 views
1

在Java和JNI中使用Matlab,我得到一個UnsatisfiedLinkError,我無法理解。Matlab + Java + JNI:java.lang.UnsatisfiedLinkError

首先我從Matlab命令行加載本地庫。它的工作原理:

>> java.lang.System.load('/usr/local/share/OpenCV/java/libopencv_java.so') 

然後,我打電話與本機庫中實現的Java函數:

>> org.opencv.core.Mat 

    Java exception occurred: 
    java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat()J 
    at org.opencv.core.Mat.n_Mat(Native Method) 
    at org.opencv.core.Mat.<init>(Mat.java:441) 

它的抱怨無法找到org.opencv.core.Mat.n_Mat().J,但該符號在。所以:

[email protected]:/usr/local/share/OpenCV/java$ nm libopencv_java.so | grep Mat_n_1Mat 
0000000000027780 T Java_org_opencv_core_Mat_n_1Mat__ 
00000000000316c0 T Java_org_opencv_core_Mat_n_1Mat__DDI 
00000000000312a0 T Java_org_opencv_core_Mat_n_1Mat__DDIDDDD 
00000000000318a0 T Java_org_opencv_core_Mat_n_1Mat__III 
00000000000314b0 T Java_org_opencv_core_Mat_n_1Mat__IIIDDDD 
0000000000030fa0 T Java_org_opencv_core_Mat_n_1Mat__JII 
0000000000031120 T Java_org_opencv_core_Mat_n_1Mat__JIIII 

所以,如果它裝載有正確的符號本地庫,爲什麼我得到一個UnsatisifiedLinkError?

回答

5

問題似乎是System.load的調用發生在Matlab REPL中,而不是在預先構建的jar中。解決方法:1)編寫一個簡單的類,只加載本地庫,2)構建類並將其添加到Matlab Java類路徑中,3)加載本地庫,調用剛剛編寫的簡單函數。

我簡單的類看起來是這樣的:

public class LoadOpenCV { 
    public static void loadOpenCV() { 
     System.load("/usr/local/share/OpenCV/java/libopencv_java.so"); 
    } 
} 

Matlab的調用看起來是這樣的:

>> LoadOpenCV.loadOpenCV 
>> org.opencv.core.Mat 

ans = 

Mat [ 0*0*CV_8UC1, isCont=false, isSubmat=false, nativeObj=0x7f174286d800, dataAddr=0x0 ] 

我們弄清楚爲什麼這個作品;這顯然是REPL和編譯代碼之間的區別。

+0

看看您是否可以在VM中啓用jni調試輸出。您可能會發現REPL爲每個新命令使用新的類加載器(或其他上下文),這會導致共享庫被卸載。 – technomage 2013-03-22 10:33:55