2013-05-26 2 views
0

자바 원시 인터페이스를 사용하려고합니다. java.lang.UnsatisfiedLinkError JNI 오류

나는 내가 거기에서 다른 라이브러리 파일을로드는/usr/lib에 에서 .so는 파일을 배치 이러한 명령
ln -s /usr/local/java/jdk1.7.0_21/include /usr/include/JNILibForProj 
gcc -I /usr/include/JNILibForProj -c -Wall -w -fpic CppCode.cpp 
gcc -shared -o libCppCode.so CppCode.o 

를 사용하여 .so 파일 공유 라이브러리 객체를 만들었습니다.

그러나 나는 제대로 같은 위치 부하에

Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libCppCode.so: /usr/lib/libCppCode.so: undefined symbol: _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 

다른 .so를 파일로

System.loadLibrary("CppCode"); 

내가 오류 사용하여 라이브러리를로드 할 때. 따라서 파일의 위치는 문제가 아닙니다. 또한 g ++로 컴파일을 시도했지만 같은 오류 메시지가 나타납니다.

도움이 될 것입니다. 감사!

편집 실제로 저는 CPP에 opencv 코드를 작성했으며 JNI를 통해 연결하려고합니다. 이 줄을 사용하여 .so 파일을 만듭니다. 나는 g ++에서 맛이 없다. 내가 쓴 것이 맞는지 확인해 줄 수 있니?

g++ -I/usr/local/include/opencv -I/usr/local/java/jdk1.7.0_21/include -I/usr/include/JNILibForProj -L/usr/local/lib -O0 -g3 -Wall -w -c -fpic -Wl,--add-stdcall-alias -shared -o "/home/shikhar/Desktop/myLib/libCppCode.so" "../src/CppCode.cpp" -lopencv_core -lpHash -lopencv_imgproc -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_flann -lopencv_highgui -lstdc++ 

.so를 만들고 그것을 복사 한 후를/usr/lib에 이전 오류 메시지가왔다하지만 지금은 무엇입니까

만 ET_DYN 및 ET_EXEC로드 할 수

편집 2
많은 히트와 시련 끝에 해결책을 찾아 냈습니다. 내 대답을 확인해주세요.

답변

1

누락 된 기호는 표준 C++ 라이브러리에 속합니다. 따라서 표준 C++ 라이브러리가 공유 라이브러리에 제대로 연결되어 있는지 확인해야합니다.

대부분, 당신은 링커 라인에 -lstdc++를 추가하여 얻을 수 있습니다

gcc -shared -o libCppCode.so -lstdc++ CppCode.o 
+0

Can y 내 편집 된 질문을 확인해주세요. 감사! –

0

하는 .so 파일을 만든 마지막 명령은 올바르게 첫 번째 편집에서

g++ -shared "../src/JavaCPPInterfaceFaceRecognition.cpp" -o "/home/shikhar/Desktop/myLib/libJavaCPPInterfaceFaceRecognition.so" -I/usr/local/include/opencv -I/usr/local/java/jdk1.7.0_21/include -I/usr/include/JNILibForProj -L/usr/local/lib -O0 -g3 -Wall -w -fpic -lopencv_core -lpHash -lopencv_imgproc -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_flann -lopencv_highgui -lstdc++ 

명령입니다 I 언급 한 오류가 있었기 때문에 연결 단계를 무시하고있었습니다.
출처 : http://www.think-techie.com/2009/08/java-native-interface-jni.html

관련 문제