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编译头文件搜索路径
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值