2013-05-26 58 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