0

Java ネイティブ インターフェイスを使用しようとしています。

これらのコマンドを使用して共有ライブラリ オブジェクト .so ファイルを作成しました

ln -s /usr/local/java/jdk1.7.0_21/include /usr/include/JNILibForProj
gcc -I /usr/include/JNILibForProj -c -Wall -w -fpic CppCode.cpp
gcc -shared -o libCppCode.so CppCode.o

.so ファイルを /usr/lib に配置し、そこから他のライブラリ ファイルをロードします。

ただし、ライブラリをロードしようとすると

System.loadLibrary("CppCode");

次のようにエラーが発生します

Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/libCppCode.so: /usr/lib/libCppCode.so: undefined symbol: _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

同じ場所にある他の .so ファイルは正しく読み込まれます。したがって、ファイルの場所は問題ではありません。g++ でコンパイルしようとしましたが、同じエラー メッセージが表示されます。

どんな助けでも大歓迎です!ありがとう!

編集 実際に私は CPP でいくつかの opencv コードを書いており、JNI を介してリンクしようとしています。現在、.so ファイルを作成するためにこの行を使用しています。私はg ++が苦手です。私が書いたことが正しいかどうかを確認してもらえますか???

g++ -I/usr/local/include/opencv -I/usr/local/java/jdk1.7.0_21/include -I/usr/include/JNILibForProj -L/usr/local/lib -O0 -g3 -Wall -w -c -fpic -Wl,--add-stdcall-alias -shared -o "/home/shikhar/Desktop/myLib/libCppCode.so" "../src/CppCode.cpp" -lopencv_core -lpHash -lopencv_imgproc -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_flann -lopencv_highgui -lstdc++

.so を作成して /usr/lib にコピーした後、以前のエラー メッセージは表示されなくなりましたが、

ET_DYN と ET_EXEC のみをロードできます

編集2
多くのヒットと試行の後、解決策を見つけました。私の答えを確認してください。

4

2 に答える 2

0

.so ファイルを正しく作成した最終的なコマンドは次のとおりです。

g++ -shared "../src/JavaCPPInterfaceFaceRecognition.cpp" -o "/home/shikhar/Desktop/myLib/libJavaCPPInterfaceFaceRecognition.so" -I/usr/local/include/opencv -I/usr/local/java/jdk1.7.0_21/include -I/usr/include/JNILibForProj -L/usr/local/lib -O0 -g3 -Wall -w -fpic -lopencv_core -lpHash -lopencv_imgproc -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_flann -lopencv_highgui -lstdc++

最初の編集で、私が言及したコマンドには conatined-c というエラーがありました。そのため、リンク手順が無視されていました
ソース: http://www.think-techie.com/2009/08/java-native-interface- jni.html

于 2013-05-26T20:08:33.330 に答える