下面详细介绍一下用ndk r9版本编译cocos2d x 2.0.4可能会遇到的各个坑吧。 错误提示1: android ndk: warning:e:\cocos2d-x\cocos2d-2.0-x-2.0.4/cocos2dx/android.mk:cocos2dx_static: local_ldlibs is always ignored for static libraries gdbserver : [a
下面详细介绍一下用ndk r9版本编译cocos2d x 2.0.4可能会遇到的各个坑吧。
错误提示1:
android ndk: warning:e:\cocos2d-x\cocos2d-2.0-x-2.0.4/cocos2dx/android.mk:cocos2dx_static: local_ldlibs is always ignored for static libraries
gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
gdbsetup : libs/armeabi/gdb.setup
compile++ thumb : cocosdenshion_static e:\cocos2d-x\cocos2d-2.0-x-2.0.4/cocosdenshion/android/simpleaudioengine.cpp: in constructor 'cocosdenshion::simpleaudioengine::simpleaudioengine()':
e:\cocos2d-x\cocos2d-2.0-x-2.0.4/cocosdenshion/android/simpleaudioengine.cpp:159:2: error: format not a string literal and no format arguments [-werror=format-security]
cc1plus.exe: some warnings being treated as errors
make: *** [obj/local/armeabi/objs-debug/cocosdenshion_static/simpleaudioengine.o] error 1
解决方法:把simpleaudioengine.cpp第159行注释掉
在文件夹cocosdenshion/android中找到simpleaudioengine.cpp文件,定位到第159行,将其注释掉如下:
//logd(devicemodel);
再次用cygwin terminal软件运行build_native.sh,又出现新的提示错误。
错误提示2:
e:/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android/../../cocosdenshion/android/opensl/openslengine.cpp:292:45: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
e:/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android/../../cocosdenshion/android/opensl/openslengine.cpp:292:45: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
e:/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android/../../cocosdenshion/android/opensl/openslengine.cpp: in member function 'void openslengine::create engine(void*)':
e:/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android/../../cocosdenshion/android/opensl/openslengine.cpp:324:3: error: format not a string literal and no format arguments [-werror=format-security]
cc1plus.exe: some warnings being treated as errors
/cygdrive/e/android-ndk-r9c/build/core/build-binary.mk:388: recipe for target 'obj/local/armeabi/objs-debug/cocosdenshion_static/opensl/openslengine.o' failed
make: *** [obj/local/armeabi/objs-debug/cocosdenshion_static/opensl/openslengine.o] error 1
make: leaving directory '/cygdrive/e/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android'
错误提示解读:warning我们就不管了,先只看error,openslengine.cpp文件324行error。
解决方法:把cocos2d-2.0-x-2.0.4\cocosdenshion\android\opensl文件夹下的openslengine.cpp文件
324行注释掉 /*logd(errorinfo);*/
再次运行build_native.sh,又提示错误。
错误提示3:
e:/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android/../../cocosdenshion/android/opensl/openslengine.cpp:292:45: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
e:/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android/../../cocosdenshion/android/opensl/openslengine.cpp:292:45: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]
[armeabi] compile++ thumb: cocosdenshion_static e:/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android/../../cocosdenshion/android/opensl/simpleaudioengineopensl.cpp: in member function 'bool simpleaudioengineopensl::initengine()':
e:/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android/../../cocosdenshion/android/opensl/simpleaudioengineopensl.cpp:41:5: error: format not a string literal and no format arguments [-werror=format-security]
cc1plus.exe: some warnings being treated as errors
/cygdrive/e/android-ndk-r9c/build/core/build-binary.mk:388: recipe for target 'obj/local/armeabi/objs-debug/cocosdens hion_static/opensl/simpleaudioengineopensl.o' failed
make: *** [obj/local/armeabi/objs-debug/cocosdenshion_static/opensl/simpleaudioengineopensl.o] error 1
make: leaving directory '/cygdrive/e/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android'
这次轮到simpleaudioengineopensl.cpp文件第41行。
解决方法:把cocos2d-2.0-x-2.0.4\cocosdenshion\android\opensl文件夹下的simpleaudioengineopensl.cpp文件第41行注释掉:
/* logd(errorinfo);*/
再次运行build_native.sh。又提示错误,warning我们就不管了,先只看error。
错误提示4:
/cygdrive/e/android-ndk-r9c/build/core/build-binary.mk:388: recipe for target 'obj/local/armeabi/objs-debug/cocos2d x_static/platform/android/cccommon.o' failed
make: *** [obj/local/armeabi/objs-debug/cocos2dx_static/platform/android/cccommon.o] error 1
make: leaving directory '/cygdrive/e/cocos2d-2.0-x-2.0.4/cocos2d-2.0-x-2.0.4/testa/proj.android'
解决方法:这次我们在application.mk文件后面添加下面代码:
app_cppflags += -wno-error=format-security
再次运行build_native.sh,然后一切就顺利了!我把so文件(libgame.so)在eclipse里面导入android项目,并编译成apk文件,测试成功。
至此,ndk r9版本就可以用build_native.sh编译成so文件(libgame.so),
已经在真机上测试cocos2d x的hello world成功。
如果再有其他报错应该不是ndk r9本身的原因,建议考虑ndk_root是否设置,或者权限的问题,
或者是项目的代码问题(有一些vc++允许通过的,这里会有细微的差异)。
如果第一次尝试做交叉编译的同学,建议不要用自己写的classes代码编译,
可以考虑用官方的helloworld,这样可以减少困扰。