JNI / C ++编译问题

时间:2017-05-18 22:16:02

标签: c++ java-native-interface

我是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文件,并且构造函数存在。

请帮忙吗?

1 个答案:

答案 0 :(得分:1)

在这里查看示例代码,您可以在其中查看JNI如何使用其他共享库。

https://github.com/mkowsiak/jnicookbook/blob/master/recipeNo023/Makefile

看起来你引用了.so文件使用的某种库。

确保将它们放在LD_LIBRARY_PATH上 - 而不仅仅是你的JNI库。