Jni生成动态库的过程中引用静态库
最近多了一个需求,为了避免我们的游戏被二次打包,需要在.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.csdn.net/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++代码调用,就一切正常。
一直没有解决~