0

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

4

2 回答 2

1

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

大多数情况下,您可以通过添加-lstdc++到链接器行来实现它:

gcc -shared -o libCppCode.so -lstdc++ CppCode.o
于 2013-05-26T18:33:45.373 回答
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

于 2013-05-26T20:08:33.330 回答