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