有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

C++ java。lang.UnsatifiedLinkError JNI错误

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

我创建了一个共享库对象。因此,请使用这些命令创建文件

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中 我从那里加载其他库文件

但是,当我尝试使用加载库时

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_

其他的。因此,相同位置的文件可以正确加载。因此,文件的位置不是问题所在。我也尝试过用g++编译,但得到了相同的错误消息

任何帮助都将不胜感激!谢谢

编辑 实际上,我已经在CPP中编写了一些opencv代码,我正在尝试通过JNI进行链接。我使用这一行来创建。现在归档吧。我不是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 上一条错误消息已消失,但现在我收到了

only ET_DYN and ET_EXEC can be loaded

编辑2
经过多次尝试,我终于想出了解决办法。请核对我的答案


共 (2) 个答案

  1. # 1 楼答案

    创建的最后一个命令。因此,文件正确无误

    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

  2. # 2 楼答案

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

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

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