jni访问静态库

通过把静态库封装到动态库的形式来实现。这个步骤需要在编译过程实现

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 会发现打包后的文件比较大。
注意,要把每个静态库链接到的库文件链接进去,有的库文件被两个以上库使用到,也要写多次。

把静态库链接到动态库还有一种方式,如
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加装的库名
-I编译头文件搜索路径

你可能感兴趣的:(jni)