前言
Linux环境下编译成功后,我们继续要进行的测试就是完成Android工程的编译。
我在第一篇《Ubuntu下搭建Cocos2d-x-3.4 / Cocos2d-x-3.6开发环境》里面提到过,直接使用Android Studio自动下载的ndk环境,不适合以前旧的cocos版本开发的游戏。即使我升级到3.6,依然不适合。
部署环境
当时,填完了所有坑,部署好3.6版本之后,用cocos new命令新建一个test工程,然后成功地编译运行了linux下的HelloWorld。 但是当用cocos compile -p Android编译Android包的时候,却报错了,看清楚它试图去找armeabi-v8a,而我们项目里面只有armeabi-v7a,我觉得是Ndk版本太高了,所以决定从Google官网下载我们从前采用的NDK r9d来重新编译。
下载地址:http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86_64.tar.bz2
特别推荐一个csdn网页,上面有很全的Android官方下载地址,我就在这里找的。
http://www.cnblogs.com/yaotong/archive/2011/01/25/1943615.html
将下载的r9d解压放到~/Android/android-ndk-r9d目录下。
然后编辑配置文件:
vim ~/.bashrc
将其中export NDK_ROOT=一项(如果没有就添加),修改为:
export NDK_ROOT=~/Android/android-ndk-r9d
然后source一下让这个设置立即生效:
source ~/.bashrc:
编译test工程的Android包
cd ~/Devlop/test
cocos compile -p Android
终于成功了,回应如下:
Move apk to /home/ace/Devlop/test/bin/debug/android
build succeeded.
The NDK version is not r10c or above.
Your application may crash or freeze on Android L(5.0) when using BMFont and HttpClient.
For More information:
https://github.com/cocos2d/cocos2d-x/issues/9114
https://github.com/cocos2d/cocos2d-x/issues/9138
Your application may crash when using c++ 11 regular expression with NDK_TOOLCHAIN_VERSION 4.8
嗯,看来cocos2d-x-3.6将ndk要求升级到了r10c或者更高。依稀回忆起3.6时代我们用lua开发的时候,是用的ndk r10d,重新下载ndk r10d,并再次配置一下环境。
下载地址:
http://dl.google.com/android/ndk/android-ndk-r10d-linux-x86_64.bin
发现不是熟悉的zip格式,而是用的bin,我讨厌这种可执行文件。下载完成后,发现文件没有执行权限。进到下载目录,下终端设置权限,然后执行:
cd ~/Downloads
chmod +x android-ndk-r10d-linux-x86_64.bin
./android-ndk-r10d-linux-x86_64.bin
自解压出一个android-ndk-r10d目录,我们把它移动到/Android目录下,然后重新设置/.bashrc并source之(过程略)。
再次cocos compile -p Android来编译Android工程,回应如下:
BUILD SUCCESSFUL
Total time: 4 seconds
Move apk to /home/ace/Devlop/test/bin/debug/android
build succeeded.
嗯,这次完美了,4秒钟那么快是因为先前编译过一次了。
就不用把这个apk拷贝到真机上测试了,我希望配置好能在AS上调试以后才开始真机调试。
编译实战项目的Android包
采用前面《Ubuntu下编译Cocos 2d-x-3.6 Linux工程》这篇文章的中实战项目CrossNew来测试。
因为原项目中接过sdk包,而且c++程序中有一些Android的编译选项,我几乎无法直接用新建工程的proj.android来增改,最好的办法是把现在的这个目录备份了,再把原来工程中的这个目录完整复制过来,最后调试检查是否有问题。
下面容是原来工程Android.mk的部分内容,主要记录一下用脚本遍历所有.cpp和.h头文件的方法:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OT_PATH := $(LOCAL_PATH)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
$(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos/editor-support)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp
define walk
$(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e)))
endef
ALLFILES = $(call walk, $(LOCAL_PATH)/../../Classes)
FILE_LIST := hellocpp/main.cpp
FILE_LIST += $(filter %.cpp, $(ALLFILES))
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
FILE_INCLUDES := $(shell find $(LOCAL_PATH)/../../Classes -type d)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
$(FILE_INCLUDES)
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
这个是3.4下实现的,不知道3.6下面会有什么幺蛾子。
开始编译
cd ~/Devlop/cross
cocos compile -p Android
漫长的等待。几乎快成功的时候报错了:
BUILD FAILED
/home/ace/Android/Sdk/tools/ant/build.xml:459: ..\cocos2d\cocos\platform\android\java resolve to a path with no project.properties file for project /home/ace/Devlop/cross/proj.android
看了一下project.properties的内容,恍然明白..\cocos2d\cocos\platform\android\java这种写法是windows平台下的写法啊,linux下都应该换成"/"。 修改为:
android.library.reference.1=../cocos2d/cocos/platform/android/java
然后重新编译,成功了。最后回应:
BUILD SUCCESSFUL
Total time: 7 seconds
Move apk to /home/ace/Devlop/cross/bin/debug/android
build succeeded.
大功告成,所有环境都算成功过了一遍。有点没想明白的是,以前用eclipse编译为什么没报错呢?难道不是用的ant编译?ant编译和ndk编译又是什么关系?不懂的东东太多,想不明白就不想了,以后慢慢会懂。
后记
刚才又狠狠想了一下,确定以前做项目的时候,应该从来没有用cocos compile来编译android工程,都是习惯进eclipse里面编译的。直接在命令行编译,是在后面做lua项目时候,因为没有好的ide环境,才养成的习惯。
网友评论