2013-03-20 4 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') 

내가 네이티브 라이브러리로 구현 된 자바 함수를 호출 :

>> 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를 찾을 수없는 불평을하지만, 그 이유는 UnsatisifiedLinkError를 얻고, 올바른 기호 네이티브 라이브러리를로드 않다면

[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 

그래서 : 그 기호는 .so를에?

답변

5

System.load에 대한 호출이 사전 빌드 된 jar가 아닌 Matlab REPL에서 발생하는 것 같습니다. 해결 방법 : 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

관련 문제