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

ephesians 2017-02-06

最近多了一个需求,为了避免我们的游戏被二次打包,需要在.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文件时一直报错

Jni生成动态库的过程中引用静态库
按照情况四的来试,一直报错,为什么呢?按情况三,都一切ok,情况四就不行了。

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

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

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

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

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

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

java会调用失败

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

一直没有解决~

相关推荐

ElvenShi / 0评论 2012-11-12