1

使用带有 Java 和 JNI 的 Matlab,我得到了一个我无法理解的 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,但该符号在 .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

因此,如果它使用正确的符号加载本机库,为什么我会收到 UnsatisifiedLinkError?

4

1 回答 1

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 和编译代码之间存在差异。

于 2013-03-20T04:48:30.683 回答