java.lang.UnsatisfiedLinkError JNI错误

时间:2013-05-26 17:00:14

标签: java c++ java-native-interface

我正在尝试使用Java本机接口。

我使用这些命令

创建了一个共享库对象.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文件放在/ usr / lib中 我从那里加载其他库文件。

但是当我尝试使用

加载库时
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 ++,你可以检查我写的是否正确???

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
经过大量的打击和试验,我已经找到了解决方案。请检查我的答案。

2 个答案:

答案 0 :(得分:1)

缺少的符号属于标准C ++库。因此,您必须确保标准C ++库已正确链接到您的共享库。

通常,您可以通过向链接器行添加-lstdc++来实现它:

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

答案 1 :(得分: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++

在第一次编辑中,我提到的命令有一个错误,它包含了c,因为它忽略了链接步骤
资料来源:http://www.think-techie.com/2009/08/java-native-interface-jni.html