最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
Cocos2d-x 3.3有关iOS移植Android问题的汇总
由于项目需求,需要将项目从iOS移植到Android。现将移植过程中遇到的问题进行简单汇总,希望能给有类似需求的开发者一些启发。
开发环境
- Mac OS X 10.9.5
- Cocos2d-x 3.3 final版本
- Xcode 6.1.1 版本
移植问题记录
1. 修改Android.mk文件
笔者的项目基于Lua开发。在之前的文章中提到过,Lua工程和C++工程的文件结构有所不同,相对而言,C++工程的移植步骤更为简单。不过,无论是C++工程还是Lua工程,都必须对Android.mk文件进行修改。
在Lua工程中,该文件的目录为:项目工程文件/frameworks/runtime-src/proj.android/jni/Android.mk 。而C++工程直接打开项目工程文件即可看到proj.android文件夹。
大家可以对比一下空的C++ HelloWorld工程和空的Lua工程中Android.mk文件的区别。以下是笔者项目最终的Android.mk文件(基于Lua工程,C++工程可能还需做些修改)供参考:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cocos2dlua_shared
LOCAL_MODULE_FILENAME := libcocos2dlua
define walk
$(wildcard $(1)) $(foreach e,$(wildcard $(1)/*),$(call walk,$(e)))
endef
ALLFILES = $(call walk,$(LOCAL_PATH)/../../Classes)
FILE_LIST := hellolua/main.cpp
FILE_LIST += $(filter %.cpp,$(ALLFILES))
FILE_LIST += $(filter %.c,$(ALLFILES))
FILE_INCLUDES := $(shell find $(LOCAL_PATH)/../../Classes -type d)
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
LOCAL_C_INCLUDES += $(shell ls -FR $(LOCAL_C_INCLUDES) | grep $(LOCAL_PATH)/$ )
LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES:$(LOCAL_PATH)/%:=$(LOCAL_PATH)/%)
LOCAL_STATIC_LIBRARIES := cocos2d_lua_static
LOCAL_STATIC_LIBRARIES += cocostudio_static
LOCAL_STATIC_LIBRARIES += cocos2dx_static
include $(BUILD_SHARED_LIBRARY)
$(call import-module,scripting/lua-bindings/proj.android)
2. 编译时找不到头文件问题
若Android.mk文件已修改完毕,在交叉编译过程中,可能会遇到找不到Cocos中某些文件的问题。例如,笔者在项目中使用了GUI,引入了CocosGUI.h头文件,但编译时却提示找不到该文件。
解决此问题的方法是补全头文件的路径。在Cocos2d-x 3.3版本中,CocosGUI.h位于ui文件夹下,因此引用时需写成#include "ui/CocosGUI.h"。在iOS项目中,不写ui不会报错,但编译时会出现问题。
3. 自定义Lua绑定问题
在Lua项目中,通常会遇到C++和Lua的交互问题,这时需要将C++的某些方法映射到Lua中,即使用lua_binding。若未将自定义的C++方法绑定到Lua,则可忽略此问题;若进行了绑定,则需要修改另一个.mk文件来完成编译。
打开 工程文件名/frameworks/cocos2d-x/cocos/scripting/lua-bindings/proj.android/Android.mk ,该文件负责编译lua_bindings工程文件中所有的C++文件。我们需要做的是在适当位置将自定义的映射文件添加进去。
4. 映射文件引用头文件问题
在自定义的映射文件中,必然需要引用工程中Classes文件夹下的cpp文件。若仅写#include "xxx.h",在iOS中不会有问题,但编译时会提示找不到该文件。此时需要添加文件的全路径,例如要引入xxx.h文件,可找到该文件,右键显示简介,获取其完整路径。
为避免版本管理出现问题,最好编写一个方法来获取文件的全路径,而不是将路径写死在本地。
5. 资源文件名
虽然iOS中的资源可以使用中文名,但不建议这么做。因为在交叉编译时,使用中文命名资源会报错。
6. .c文件
在第一个问题的Android.mk文件中,有一行代码FILE_LIST += $(filter %.c,$(ALLFILES))。这是因为笔者的项目中使用了cjson库,而cjson使用的是C源文件。所以在编译时,不仅要编译C++文件,还要编译.c文件,否则无法正常使用。