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