Cocos2d-x集成libpomelo

版本信息

cocos2dx版本 3.11.1

libpomelo2版本為0.3.5

操作系統(tǒng) OS X 10.11.4

一 生成libpomelo2的靜態(tài)鏈接庫

1. 獲取libpomelo2源碼

git clone https://github.com/NetEase/libpomelo2.git

2.獲取gyp源碼并安裝

如果已經(jīng)安裝gyp齿梁,請略過該步驟抛虏。

git clone https://github.com/martine/gyp.git
cd gyp
python setup.py

3.生成libpomelo2項(xiàng)目

進(jìn)入libpomelo2目錄,使用gyp生成xcode項(xiàng)目痰腮。設(shè)置參數(shù)不使用tls和不使用系統(tǒng)的openssl

gyp --depth=. pomelo.gyp -Duse_sys_openssl=false -Dno_tls_support=true -Dpomelo_library=static_library

如果目錄中生成pomelo.xcodeproj則生成項(xiàng)目成功。

4.編譯靜態(tài)鏈接庫

編譯架構(gòu)(Architectures)為armv7arm64的libpomelo2靜態(tài)鏈接庫浓体,適用于iOS設(shè)備挤悉。

不編譯libpomelo2自帶的openssl,因?yàn)榫幾g時會失敗煌抒。由github的OpenSSL-for-iPhone項(xiàng)目中的openssl庫替代仍劈。

xcodebuild -project pomelo.xcodeproj -target libpomelo2 -sdk iphoneos9.3
xcodebuild -project deps/uv/uv.xcodeproj -target libuv -sdk iphoneos9.3
編譯架構(gòu)(Architectures)為i386x_86的libpomelo2靜態(tài)鏈接庫,適用于Mac,PC以及Android寡壮。
xcodebuild -project pomelo.xcodeproj -target libpomelo2 -sdk iphonesimulator9.3
xcodebuild -project deps/uv/uv.xcodeproj -target libuv -sdk iphonesimulator9.3

如果出現(xiàn) xcodebuild: error: SDK "iphoneos9.3" cannot be located. 錯誤可以使用以下命令來查看可以使用的sdk名稱贩疙。替換命令中-sdk參數(shù)的值。

xcodebuild -sdk -version

編譯成功后况既,會在./build/目錄下找到編譯的靜態(tài)鏈接庫这溅,uv庫在./deps/uv/build/目錄下。

可以使用lipo命令查看靜態(tài)鏈接庫的信息棒仍。

例如:
lipo -info xxx.a;
打印信息:
Architectures in the fat file: xxx.a are: armv7 arm64
編譯openssl靜態(tài)庫

獲取OpenSSL-for-iPhone項(xiàng)目源碼

https://github.com/x2on/OpenSSL-for-iPhone.git

進(jìn)入目錄悲靴,執(zhí)行編譯腳本

cd OpenSSL-for-iPhone
./build-libssl.sh

編譯成功后,會在./lib/目錄下找到libpomelo2需要的libssl.alibcrypto.a兩個靜態(tài)庫莫其。使用lipo -info命令會發(fā)現(xiàn)這兩個庫已經(jīng)適用i386 armv7 armv7s x86_64 arm64癞尚。

合并靜態(tài)鏈接庫

我們的libpomelo的靜態(tài)鏈接庫最好也適用各個平臺,更有通用性榜配。
當(dāng)然否纬,如果只需要在某個平臺運(yùn)行,或者按平臺分別設(shè)置使用不同的靜態(tài)庫蛋褥,也可以跳過該步驟临燃。
進(jìn)入libpomelo2目錄,輸入:

mkdir lib
lipo -create ./build/Default-iphoneos/libpomelo2.a ./build/Default-iphonesimulator/libpomelo2.a -output ./lib/libpomelo2.a
lipo -create ./deps/uv/build/Default-iphoneos/libuv.a ./deps/uv/build/Default-iphonesimulator/libuv.a -output ./lib/libuv.a

合并之后的靜態(tài)庫在./lib目錄下烙心,可以用lipo -info來查看合并后靜態(tài)庫架構(gòu)信息膜廊。

二 配置Cocos2dx項(xiàng)目

新建一個cocos2dx項(xiàng)目
cocos new Cocos2dx_pomelo -l cpp
整理libpomelo2文件

新建一個目錄命名為libpomelo2,用于放置靜態(tài)鏈接庫和頭文件淫茵。

此處與之前下載下來的libpomelo2庫名稱沖突爪瓜,下面的配置用libpomelo2文件夾libpomelo2項(xiàng)目用以區(qū)分。

  • 復(fù)制OpenSSL-for-iPhone項(xiàng)目中的 include/openssl文件夾 到 libpomelo2/include
  • 復(fù)制libpomelo2項(xiàng)目中的 deps/uv/include文件夾中的所有文件 到 libpomelo2/include
  • 復(fù)制libpomelo2項(xiàng)目中的 include文件夾中的所有文件 到 libpomelo2/include
  • 復(fù)制編譯好的libcrypto.a libpomelo2.a libssl.a libuv.alibpomelo2/prebuild

目錄結(jié)構(gòu):

libpomelo2
├── include
│   ├── android-ifaddrs.h
│   ├── openssl
│   │   ├── aes.h
│   │   ├── asn1.h
│   │   ├── ...
│   │   └── x509v3.h
│   ├── pomelo.h
│   ├── pomelo_trans.h
│   ├── pthread-fixes.h
│   ├── stdint-msvc2008.h
│   ├── tree.h
│   ├── uv-aix.h
│   ├── ...
│   └── uv.h
└── prebuild
    ├── libcrypto.a
    ├── libpomelo2.a
    ├── libssl.a
    └── libuv.a
集成libpomel2到cocos2dx項(xiàng)目

拷貝libpomelo2文件夾到Cocos2dx_pomelo的項(xiàng)目目錄中匙瘪。
因?yàn)閏ocos2d-x的Android編譯腳本android-build.py中設(shè)置的NDK_MODULE_PATH是:

YOUR_PROJECT_PATH/proj.android/../cocos2d
YOUR_PROJECT_PATH/proj.android/../cocos2d/cocos
YOUR_PROJECT_PATH/proj.android/../cocos2d/external

所以铆铆,如果考慮到Android平臺的編譯的便易性蝶缀,建議將整理出的libpomelo2文件夾放到上面三個目錄中的一個。

之后的配置按照放在 YOUR_PROJECT_PATH/proj.android/../cocos2d/external 目錄來設(shè)置薄货。

打開Xcode項(xiàng)目文件Cocos2dx_pomelo.xcodeproj

  • 在項(xiàng)目中添加libpomelo2文件夾
  • User Header Search Paths 中添加 $(SRCROOT)/../cocos2d/external/libpomelo2/include
  • Library Search Paths 中添加 $(SRCROOT)/../cocos2d/external/libpomelo2/prebuild
  • Linked Frameworkds and Libraries 中添加libpomelo2目錄中的libcrypto.a libpomelo2.a libssl.a libuv.a

注意:iOS設(shè)備運(yùn)行需要修改兩個設(shè)置

  • Remove Text Metadata From PNG Files: No
  • Enable Bitcode: No

在HelloWorldScene.cpp中引入頭文件 "pomelo.h"翁都,在init()方法中加入測試代碼:

pc_lib_init(NULL, NULL, NULL, NULL);

// 初始化客戶端
pc_client_config_t config = {
    30, /* conn_timeout */
    1, /* enable_reconn */
    PC_ALWAYS_RETRY, /* reconn_max_retry */
    2, /* reconn_delay */
    30, /* reconn_delay_max */
    1, /* reconn_exp_backoff */
    1, /* enable_polling */
    NULL, /* local_storage_cb */
    NULL, /* ls_ex_data */
    PC_TR_NAME_UV_TCP /* transport_name */
};

pc_client_t* m_client = (pc_client_t*)malloc(pc_client_size());
CCLOG("pomelo init = %d",pc_client_init(m_client, (void*)0x0, &config));

至此,可以開始在Mac谅猾,iOS模擬器柄慰,iOS設(shè)備上測試使用。

三 集成到Android平臺

1.繼續(xù)整理libpomelo2文件夾
  • 復(fù)制libpomelo2項(xiàng)目中的 deps/uv文件夾中 到 libpomelo2/deps/
  • 復(fù)制libpomelo2項(xiàng)目中Android.mk 文件 到 libpomelo2/
  • 復(fù)制libpomelo2項(xiàng)目中CMakeLists.txt 文件 到 libpomelo2/
  • 復(fù)制libpomelo2項(xiàng)目中src 文件夾 到 libpomelo2/

整理后的目錄結(jié)構(gòu):

libpomelo2
├── Android.mk
├── CMakeLists.txt
├── deps
│   └── uv
│       | ...
├── include
│   ├── android-ifaddrs.h
│   ├── openssl
│   │   ├── aes.h
│   │   ├── asn1.h
│   │   ├── ...
│   │   └── x509v3.h
│   ├── pomelo.h
│   ├── pomelo_trans.h
│   ├── pthread-fixes.h
│   ├── stdint-msvc2008.h
│   ├── tree.h
│   ├── uv-aix.h
│   ├── ...
│   └── uv.h
├── prebuild
│   ├── libcrypto.a
│   ├── libpomelo2.a
│   ├── libssl.a
│   └── libuv.a
└── src
    ├── pc_JSON.c
    ├── ...
    ├── queue.h
    └── tr
        ├── ...
2.修改libpomelo2/Android.mk

官方的libpomelo2庫 Android.mk是我之前的一個同事pr的税娜,之后更新版本后這個文件就一直沒有維護(hù)坐搔,所以編譯時報(bào)錯,需要我們自己修改一下敬矩。

需要修改的地方有:

  • LOCAL_SRC_FILES 這里需要列出libpomelo2/src中所有的.c文件
  • 刪除廢棄使用的靜態(tài)庫配置

修改后的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := pomelo_static

LOCAL_MODULE_FILENAME := libpomelo2

LOCAL_SRC_FILES := \
src/pc_JSON.c \
src/pc_lib.c \
src/pc_pomelo.c \
src/pc_trans.c \
src/pc_trans_repo.c \
src/tr/dummy/tr_dummy.c \
src/tr/uv/pb_decode.c \
src/tr/uv/pb_encode.c \
src/tr/uv/pb_i.c \
src/tr/uv/pr_msg.c \
src/tr/uv/pr_msg_json.c \
src/tr/uv/pr_msg_pb.c \
src/tr/uv/pr_pkg.c \
src/tr/uv/tr_uv_tcp.c \
src/tr/uv/tr_uv_tcp_aux.c \
src/tr/uv/tr_uv_tcp_i.c \
src/tr/uv/tr_uv_tls.c \
src/tr/uv/tr_uv_tls_aux.c \
src/tr/uv/tr_uv_tls_i.c


LOCAL_CFLAGS := -DPC_NO_UV_TLS_TRANS

LOCAL_EXPORT_C_INCLUDES :=$(LOCAL_PATH)/include



LOCAL_C_INCLUDES := $(LOCAL_PATH)/include \
                    $(LOCAL_PATH)/src \
                    $(LOCAL_PATH)/src/tr/dummy \
                    $(LOCAL_PATH)/src/tr/uv \

LOCAL_WHOLE_STATIC_LIBRARIES := uv_static

include $(BUILD_STATIC_LIBRARY)

LOCAL_CFLAGS    := -D__ANDROID__ 

$(call import-module,libpomelo2/deps/uv)
3.修改cocos/Android.mk
  • 引入libpomelo module
  • 加入頭文件路徑

修改后:

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) \
                            ...
                            $(LOCAL_PATH)/../libpomelo2/include \
                            
LOCAL_C_INCLUDES := $(LOCAL_PATH) \
                    ...
                    $(LOCAL_PATH)/../libpomelo2/include \
                    
                    
LOCAL_MODULE := cocos2dx_static
LOCAL_MODULE_FILENAME := libcocos2d
...
LOCAL_STATIC_LIBRARIES += pomelo_static


$(call import-module,libpomelo2)

進(jìn)入Cocos2dx_pomelo項(xiàng)目文件夾概行,編譯Android

cocos run -p android

另外說一下,pomelo本來就是網(wǎng)易內(nèi)部自用的東西谤绳,開源的過程中也是你能用就用占锯,不能用就別用的心態(tài)。所以也不要奢求有什么文檔缩筛,及時更新及時修復(fù)bug這些要求,這也從一個角度反映出中國公司對待開源項(xiàng)目的普遍態(tài)度堡称。
Cocos2d-x也是個笑話瞎抛,看產(chǎn)品過程就知道公司是什么樣子,折騰來折騰去的來證明自己能力有限却紧。最后干脆以Unity3D為榜樣桐臊,開始抄人家的架構(gòu)和編輯器。最后結(jié)果可能還是會證明晓殊,觸控能力有限断凶,本來就是一家三流公司,非要裝國際化大公司巫俺。

吐槽結(jié)束认烁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市介汹,隨后出現(xiàn)的幾起案子却嗡,更是在濱河造成了極大的恐慌,老刑警劉巖嘹承,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窗价,死亡現(xiàn)場離奇詭異,居然都是意外死亡叹卷,警方通過查閱死者的電腦和手機(jī)撼港,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門坪它,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帝牡,你說我怎么就攤上這事哟楷。” “怎么了否灾?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵卖擅,是天一觀的道長。 經(jīng)常有香客問我墨技,道長惩阶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任扣汪,我火速辦了婚禮断楷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘崭别。我一直安慰自己冬筒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布茅主。 她就那樣靜靜地躺著舞痰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诀姚。 梳的紋絲不亂的頭發(fā)上响牛,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音赫段,去河邊找鬼呀打。 笑死,一個胖子當(dāng)著我的面吹牛糯笙,可吹牛的內(nèi)容都是我干的贬丛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼给涕,長吁一口氣:“原來是場噩夢啊……” “哼豺憔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稠炬,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤焕阿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后首启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暮屡,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年毅桃,在試婚紗的時候發(fā)現(xiàn)自己被綠了褒纲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片准夷。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖莺掠,靈堂內(nèi)的尸體忽然破棺而出衫嵌,到底是詐尸還是另有隱情,我是刑警寧澤彻秆,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布楔绞,位于F島的核電站,受9級特大地震影響唇兑,放射性物質(zhì)發(fā)生泄漏酒朵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一扎附、第九天 我趴在偏房一處隱蔽的房頂上張望蔫耽。 院中可真熱鬧,春花似錦留夜、人聲如沸匙铡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳖眼。三九已至,卻和暖如春即纲,著一層夾襖步出監(jiān)牢的瞬間具帮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工低斋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匪凡。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓膊畴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親病游。 傳聞我的和親對象是個殘疾皇子唇跨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容