私は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ファイルをチェックしますクラスとコンストラクタが存在します。
助けてください?
ライブラリの構築に使用されたすべてのコマンドを投稿してください。また、この質問はおそらく2つの別々の質問に分割されるべきです。 –
野生の推測だが多分いくつかの名前のマングリングの問題 - JAVAが実行している関数宣言はextern "C"ブロックで囲まれていますか? –