Cocos2d-x 3.3有关iOS移植Android问题的汇总

2015年03月18日 11:42 0 点赞 0 评论 更新于 2025-11-21 14:18

由于项目需求,需要将项目从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文件,否则无法正常使用。