我是C ++的新手,并尝试编译.so文件,以便通过Java中的JNI运行它。
C ++文件夹的目录结构是:
/
/lib/ - this contains a .a file = library.a below
/folder1 - this contains the .cpp .h and .o files
情景1:
我正在运行以下内容:
g++ -std=c++11 -I$JAVA_HOME/include -Ifolder1/ -I$JAVA_HOME/include/linux -o outputFileName.so inputFileName.cpp -Llib -llibrary.a -fPIC -shared
我收到以下错误:
relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
所有文件和.so对象都有-fPIC标志。问题是什么?
情景2:
我正在运行以下内容:
g++ -std=c++11 -I$JAVA_HOME/include -Ifolder1/ -I$JAVA_HOME/include/linux -o outputFileName.so inputFileName.cpp -shared
所以没有-L和-l标志。
我得到.so文件并将其放在/ usr / lib中,并附带相关的命名,即" lib"字首。当我运行Java程序时,我得到:
symbol lookup error: /usr/lib/outputFileName.so: undefined symbol: _ZN3...
我使用c ++ filt来反编译符号,我得到了对这样一个类的引用:
namespace::Class::Constructor
我检查了类的.cpp文件,并且构造函数存在。
请帮忙吗?
答案 0 :(得分:1)
在这里查看示例代码,您可以在其中查看JNI如何使用其他共享库。
https://github.com/mkowsiak/jnicookbook/blob/master/recipeNo023/Makefile
看起来你引用了.so文件使用的某种库。
确保将它们放在LD_LIBRARY_PATH上 - 而不仅仅是你的JNI库。