2013-05-26 91 views
0

我正在嘗試使用Java本地接口。java.lang.UnsatisfiedLinkError JNI錯誤

我創建一個共享庫對象.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 

我放在/ usr/lib中 的.so文件我從那裏加載其他的庫文件。

然而,當我試圖加載正確使用

System.loadLibrary("CppCode"); 

我得到錯誤的庫作爲

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

其他.so文件在同一位置的負載。所以文件的位置不是問題。我也嘗試編譯與g ++,但我得到相同的錯誤信息。

任何幫助,將不勝感激!謝謝!

編輯 其實我在CPP中寫了一些opencv代碼,我試圖通過JNI鏈接。我正在使用這一行來創建.so文件。我不是在g ++ ood,請你檢查一下我寫的是否正確?

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++ 

。所以創建和複製它後,/ usr/lib目錄 以前的錯誤消息已經但是現在我越來越

僅ET_DYN和ET_EXEC可以裝載

編輯2
經過大量的打擊和審判,我已經找到了解決方案。請檢查我的答案。

回答

1

缺失的符號屬於標準C++庫。所以你必須確保標準C++庫正確鏈接到你的共享庫。

大多數情況下,你可以通過添加-lstdc++到連接線實現它:

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

Can y ou請檢查我編輯的問題嗎?謝謝! –

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++ 

在第一個編輯,命令我提到有一個錯誤,它conatined-C,因爲它忽略了連接步驟
來源:http://www.think-techie.com/2009/08/java-native-interface-jni.html