笔者在接入移动MM计费SDK的时候遇到了一个很严重的问题。
问题是这样的,移动MM提供的SDK包含jar和一堆so文件,按照说明文档,只需要将jar和so文件拷入libs下对应的文件夹即可。但笔者是Cocos2dx项目,Cocos2dx是C++和java混编移植的,也就是需要用到JNI,需要在jni目录下编写Android.mk文件。
一般在Android.mk引入第三方so的写法如下:
的确一般这样写就可以让Eclipse将so拷贝到libs目录。
可是实际测试结果是,那些so文件被Eclipse拷贝过去后竟然都变成了1kb,实际执行app的时候自然会报错,提示找不到so。
笔者由于不熟悉jni的原理,反复修改检查so文件,甚至新建一个空项目去测试so,结果是,只要编译,那些so都会变成1kb。
分析一下可以猜出,是因为Eclipse重新编译了so,而我们不需要编译,只需要它拷贝就行了。
笔者查遍百度也没得到解决办法,可恶的JNI硬是要给我重新编译so,编译成1kb...
笔者困扰了几天几夜,不吹牛,差点就放弃这个项目了。
编译so吧,第三方so报错,不编译so吧,cocos2dx本身的so又没了。
苦恼,纠结,可能部分朋友不知道我在说什么,但是实用第三方sdk拷贝so文件的同学很可能会遇到同样的问题。
最终,笔者想起了一个脑残的办法。
既然cocos2dx要生成so,其他so不需要编译,那么能不能先生成cocos2dx的so,然后一起拷贝呢?
可以。
首先,Android.mk里不要写那些第三方so,直接编译cocos2dx的so。
编译完成后,在项目设置中的builder中,去掉所有CDT、自定义builder,也就是不在进行混编。
然后把你刚刚生成的so和第三方so,直接复制到libs目录,这样Eclipse就不会再去管jni,再次编译,ok!大功告成!
哈哈,方法是脑残了一点,每次修改cocos2dx内容都要重复一遍,但是这样确实解决了困扰了笔者几天几夜的bug。
笔者愚钝,不知其中原理,只是弄出了这么个笨办法解决了问题,希望能给遇到相同问题的同学一些帮助。
哎,有时候独立开发,确实得用一些笨办法。
何乐而不为呢?