Jni生成动态库的过程中引用静态库

本文记录了作者尝试将一个.a静态库文件用于游戏的.so文件过程中遇到的问题及解决方案。包括如何生成.a文件、如何正确配置Android.mk文件、解决在.so文件中引用.a文件时出现的错误,以及在Linux环境下使用nm命令检查动态库文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近多了一个需求,为了避免我们的游戏被二次打包,需要在.so文件中检查签名的MD5值,而最好是把检查签名的做成一个.a文件,给游戏的.so文件使用。

于是我开始尝试生成.a文件给游戏的.so文件使用。

-------------------------------------------------

一些相关指令:

查看.a文件都包含了那些文件

    ar -t  xxx.a

查看.so文件接口

    nm -D xxx.so

查看一个(.a .o .so)文件的接口

    nm -C foo.a

    nm -C foo.o

(加-C指令可以输出原始的函数声明,参考贴:http://blog.youkuaiyun.com/a_tu_/article/details/43987865)

-------------------------------------------------

第一天:

我折腾了一下在eclipse下开发纯C++,很好,还生成了静态库文件,good~

 

第二天:

1.我按网上说的方法写好了Android.mk文件

参考贴:http://www.cnblogs.com/codingking/p/3852857.html

 

2.进入jni所在目录,运行命令  ndk-build

 

3.尝试在游戏的.so文件中引用静态库,可是在生成.so文件时一直报错


按照情况四的来试,一直报错,为什么呢?按情况三,都一切ok,情况四就不行了。

后来我想起来,我的.a文件是用c++工程生成的,不是按照安卓这套逻辑来的,于是换成情况三中生成的.a文件,一切ok了!

 

4.后来,我尝试把c++代码,都放到静态库那里,运行时报错



后来在Linux上用 nm -D *.so 查看了一下动态库文件,放在静态库里编译的cpp文件,在so文件中都找不到相关的符号



再后来发现,静态库里定义JNI方法,例如:JNIEXPORT jstring JNICALL Java_***  

java会调用失败

但是,只是定义一些普通的C++方法,给C++代码调用,就一切正常。

 

一直没有解决~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值