1. 程式人生 > >Cocos2d-x教程(38)-iOS移植Android

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檔案的編譯,否則就無法使用。