標籤:cocos2d-x 交叉編譯 移植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_sharedLOCAL_MODULE_FILENAME := libcocos2dluadefine walk $(wildcard $(1)) $(foreach e,$(wildcard $(1)/*),$(call walk,$(e)))endefALLFILES = $(call walk,$(LOCAL_PATH)/../../Classes)FILE_LIST := hellolua/main.cppFILE_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)/../../ClassesLOCAL_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_staticLOCAL_STATIC_LIBRARIES += cocostudio_staticLOCAL_STATIC_LIBRARIES += cocos2dx_staticinclude $(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檔案的編譯,否則就無法使用。
Cocos2d-x教程(38)-iOS移植Android