emc*_*sen 1 java java-native-interface matlab unsatisfiedlinkerror
使用Matlab与Java和JNI,我得到一个我无法理解的UnsatisfiedLinkError.
首先,我从Matlab命令行加载本机库.有用:
>> java.lang.System.load('/usr/local/share/OpenCV/java/libopencv_java.so')
Run Code Online (Sandbox Code Playgroud)
然后我调用用本机库实现的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)
Run Code Online (Sandbox Code Playgroud)
它抱怨它无法找到org.opencv.core.Mat.n_Mat()J,但该符号位于.so中:
echristiansen@jnu:/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
Run Code Online (Sandbox Code Playgroud)
因此,如果它使用正确的符号加载本机库,为什么我会收到UnsatisifiedLinkError?
问题似乎是对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");
}
}
Run Code Online (Sandbox Code Playgroud)
Matlab调用如下所示:
>> LoadOpenCV.loadOpenCV
>> org.opencv.core.Mat
ans =
Mat [ 0*0*CV_8UC1, isCont=false, isSubmat=false, nativeObj=0x7f174286d800, dataAddr=0x0 ]
Run Code Online (Sandbox Code Playgroud)
现在弄清楚为什么这样有效; 显然,REPL和编译代码之间存在差异.