因为项目原因,需要进行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++可能还需要做些修改)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)

上面是笔者目前项目中的完整的Android.mk文件。


(2) 编译时找不到头文件问题

如果.mk文件已修改好,在交叉编译过程中,我们可能会遇到找不到某某文件的问题,这里的文件指的是Cocos中的某些文件,例如笔者在项目中使用了GUI,引入了CocosGUI.h的头文件,但在编译时却发现找不到。解决这个问题的方法是将该头文件的路径补全,例如CocosGUI.h 在3.3版本中位于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++文件都是在这个mk文件中完成的,我们需要做的就是在适当的位置将我们自定义的映射文件加到里面,如下图:

20150317110050065.jpg

(4) 映射文件引用头文件问题

在我们的自定义的映射文件中,必然需要引用工程中的Classes文件夹下的cpp文件,如果这里我们仅仅是写 #include "xxx.h" 在iOS是没有问题的,但在编译时,同样会提示找不到这个xxx文件。这里需要加上的是这个文件的全路径,比如你要引入 xxx.h文件 ,找到这个文件,右键显示简介,显示出来的路径就是我们要在这里写的路径。这里最好的方法是写一个方法去获取文件的全路径,否则如果写死在本地在版本管理中会出现问题。


(5) 资源文件名

iOS中的资源虽然可以使用中文名,但是正常人都知道不要使用中文命名,虽然iOS中不会有问题,但在交叉编译时使用中文命名资源同样会报错。


(6) .c文件

笔者的第一个问题中,其中有一行写的是:FILE_LIST += $(filter %.c,$(ALLFILES))

这是由于笔者的项目中使用了cjson库,而cjson中使用的是C的源文件,所以我们在编译时仅仅将C++编译是不够的,还要对.c文件的编译,否则就无法使用。