欢迎加入Cocos2d-x 交流群:193411763
转载时请注明原文出处 :http://blog.csdn.net/u012945598/article/details/44338659
-----------------------------------------------------------------------------------------------------------------------------------------------------------
笔者的开发环境:
Mac OS X 10.9.5
Cocos2d-x 3.3 final版本
Xcode 6.1.1 版本
本篇文章主要记录笔者在移植中遇到的一些问题。
笔者的项目是基于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)
上面是笔者目前项目中的完整的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文件中完成的,我们需要做的就是在适当的位置将我们自定义的映射文件加到里面,如下图:
在我们的自定义的映射文件中,必然需要引用工程中的Classes文件夹下的cpp文件,如果这里我们仅仅是写 #include "xxx.h" 在iOS是没有问题的,但在编译时,同样会提示找不到这个xxx文件。这里需要加上的是这个文件的全路径,比如你要引入 xxx.h文件 ,找到这个文件,右键显示简介,显示出来的路径就是我们要在这里写的路径。这里最好的方法是写一个方法去获取文件的全路径,否则如果写死在本地在版本管理中会出现问题。
(5) 资源文件名
iOS中的资源虽然可以使用中文名,但是正常人都知道不要使用中文命名,虽然iOS中不会有问题,但在交叉编译时使用中文命名资源同样会报错。
(6) .c文件
笔者的第一个问题中,其中有一行写的是:FILE_LIST += $(filter %.c,$(ALLFILES))
这是由于笔者的项目中使用了cjson库,而cjson中使用的是C的源文件,所以我们在编译时仅仅将C++编译是不够的,还要对.c文件的编译,否则就无法使用。