当我们在使用Cocos2d-x 进行开发的时候,可能会使用到XCode和Eclipse进行混编开发,但是当在Android版本代码中要使用第三方的.so的时候,会出现如下错误:
04-11 21:08:59.645: E/AndroidRuntime(25490): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load XX: findLibrary returned null
04-11 21:08:59.645: E/AndroidRuntime(25490): at java.lang.Runtime.loadLibrary(Runtime.java:429)
04-11 21:08:59.645: E/AndroidRuntime(25490): at java.lang.System.loadLibrary(System.java:554)
很明显这个是找不到我们的放到libs/armeabi目录下面的第三方的XX.so,但是我们明明是将这个拷到libs/armeabi目录下面去了丫,仔细检查下,发现,libs/armeabi目录下面只有
gbd.setup gdbserver libgame.so这三个文件,那我们的XX.so哪去了呢?
经过查询控制台信息,发现了这么一段:
rm -f ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/mips/lib*.so ./libs/x86/lib*.so
rm -f ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/mips/gdbserver ./libs/x86/gdbserver
rm -f ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/mips/gdb.setup ./libs/x86/gdb.setup
囧!原来ndk编译的时候,将libs/armeabi目录下面所有.so都给删除了,然后将重新编译得到的.so放到这个目录下面,这咋整呢?
单独编译游戏的代码,然后将libgame.so和我的xx.so一起放到libs/armeabi目录下作为一个普通的工程使用,不参与与Xcode的混编,感觉这个方案是可行的,但是,那稍微更改一点东西,要调试、观察起来该有多么麻烦丫?
解决方案:
在我们工程的Android.mk文件中,添加如下代码即可:
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := (includes for XX)
LOCAL_MODULE := XX
LOCAL_SRC_FILES := libXX.so
include $(PREBUILT_SHARED_LIBRARY)
这样,我们就可以继续我们的混编之路了!
参考资料:
http://stackoverflow.com/questions/10593987/android-ndk-linking