2017-05-18 101 views
1

我是C++新手,嘗試編譯.so文件以通過Java中的JNI運行它。JNI/C++編譯問題

的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

請發佈所有用於構建庫的命令。此外,這個問題可能應該分成兩個單獨的問題。 –

+0

瘋狂的猜測,但也許一些名稱mangling的問題 - 函數聲明你是從JAVA運行包裹在外部「C」塊? –

回答