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の呼び出しが、ビルド済みのjarではなく、MatlabREPLで発生することのようです。回避策: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 に答える