Cocos2d-x教程(38)-iOS移植Android

欢迎加入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 版本

       

       本篇文章主要记录笔者在移植中遇到的一些问题。


(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)

上面是笔者目前项目中的完整的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文件中完成的,我们需要做的就是在适当的位置将我们自定义的映射文件加到里面,如下图:

     技术分享


(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文件的编译,否则就无法使用。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。