jni静的ライブラリへのアクセス

3037 ワード

静的ライブラリを動的ライブラリにカプセル化する形式で実現する.このステップはコンパイルプロセスで実装する必要があります
g++ -g -o libMydll.so -fPIC -shared Mydll.cpp -I/usr/local/jdk1.7.0_17/include -I/usr/local/jdk1.7.0_17/include/linux -I. -I../src/__util -I../src/__xml4nlp -I../src/_split_sentence -I../src/_crfwordsegment -I../src/_svmtagger -I../src/_ner -I../src/_gparser -I../src/_srl -I../src/__ltp_dll -I../thirdparty/crfpp -I../thirdparty/maxent -I../thirdparty/tinyxml  -L/root/ltp/lib  -L/usr/local/jdk1.7.0_17/jre/lib/i386/client -rdynamic -lmaxent ../lib/libcrfpp.a ../lib/libutil.a ../lib/libltp.a ../lib/libsplitsnt.a ../lib/libcrfwordseg.a ../lib/libpostagger.a -lgparser ../lib/libner.a ../lib/libsrl.a ../lib/libxml4nlp.a -ldl -lpthread ../lib/libboost_regex.a ../lib/libcrfpp.a -lmaxent ../lib/libutil.a ../lib/libtinyxml.a -Wl,-rpath,/root/ltp/lib:/usr/local/jdk1.7.0_17/jre/lib/i386/client

プログラムがコンパイルされると、静的ファイルはlibMydllにパッケージされます.so,ll-h libMydllを実行する.soはパッケージされたファイルが大きいことに気づきます.
注意:各静的ライブラリがリンクされているライブラリファイルをリンクするには、2つ以上のライブラリで使用されているライブラリファイルも複数回書きます.
静的ライブラリをダイナミックライブラリにリンクするには、次のような方法があります.
g++ -g -o libMydll.so -fPIC -shared Mydll.cpp -I/usr/local/jdk1.7.0_17/include -I/usr/local/jdk1.7.0_17/include/linux -I. -I../src/__util -I../src/__xml4nlp -I../src/_split_sentence -I../src/_crfwordsegment -I../src/_svmtagger -I../src/_ner -I../src/_gparser -I../src/_srl -I../src/__ltp_dll -I../thirdparty/crfpp -I../thirdparty/maxent -I../thirdparty/tinyxml  -Wl,-Bstatic -L/root/ltp/lib -lutil -lmaxent -lcrfpp  -lltp -lsplitsnt -lcrfwordseg -lpostagger -lgparser -lner -lsrl -lxml4nlp -lboost_regex -Wl,-Bdynamic -ldl -lpthread -Wl,-Bdynamic

しかし、実測のヒントはsymbolが見つからないので、他の人のプログラムをコンパイルする場合は、リンクが多く、お勧めしません.
もう一つの方法は、すでにある場合です.aスタティックライブラリ、よろしいでしょうスタティックライブラリをsoファイルに変換
静的ライブラリ解凍(ar-x libxyz.a)を動的ライブラリにコンパイルする
ar -x mylib.a
	gcc -shared *.o -o libmaxent.so -lz -lm

多くの静的ライブラリを変換する場合は、スクリプトを使用して次のようにします.
#!/bin/sh

	CLASSPATH="."
	JARDIR="../lib1"
	if [ -d "$JARDIR" ]; then
	   for i in "$JARDIR"/*.a; do
		 ar -x "$i"
		 gcc -shared *.o -o ${i%*.a}.so
		 echo ${i%*.a}
		 rm -f *.o
	   done
	fi

プログラム実行プロンプトがxxxを見つけられなかった場合.so、LD_を設定する必要がありますLIBRARY_PATH.
いくつかのライブラリファイルに数字が付いている場合は、
ln -s libh.so.1.0 libh.so

現在のディレクトリにダイナミックリンクライブラリを作成し、もう一つの重要なコマンドldd
のように
ldd xxx.so
、参照されているライブラリを表示できます
g++コンパイルの知識:
オプション-rdynamicは、リンクにすべてのシンボルをダイナミックシンボルテーブルに追加するように通知します.
(dlopenを用いて後方追跡を実現することを目的とする)
-Wlは、GCCが後のn個のカンマ分割を示すパラメータをコネクタに渡す
-fpicコンパイラは、位置に関係のないターゲットコードを生成する.共有ライブラリ(shared library)に適用する.
-fPICコンパイラは、出力位置に関係なくターゲットコードを出力.ダイナミックコネクション(dynamic linking)に適用する、ブランチが広範囲に移行する必要がある場合でも.
Bdynamicはリンクダイナミックライブラリを表します
-Lライブラリロックディレクトリ
-lマウントされたライブラリ名
-コンパイルヘッダファイル検索パス