2017-05-18 10 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

ライブラリの構築に使用されたすべてのコマンドを投稿してください。また、この質問はおそらく2つの別々の質問に分割されるべきです。 –

+0

野生の推測だが多分いくつかの名前のマングリングの問題 - JAVAが実行している関数宣言はextern "C"ブロックで囲まれていますか? –

答えて

1

ここで、JNIが他の共有ライブラリをどのように使用できるかを示すサンプルコードをご覧ください。

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

あなたの.soファイルで使用されているLIBSのいくつかの並べ替えを参照してくださいように見えます。

あなたのJNIライブラリだけではなく、LD_LIBRARY_PATHにそれらがあることを確認してください。