Cocos2d-x集成libpomelo

版本信息

cocos2dx版本 3.11.1

libpomelo2版本為0.3.5

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

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

1. 獲取libpomelo2源碼

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

2.獲取gyp源碼并安裝

如果已經(jīng)安裝gyp,請(qǐng)略過(guò)該步驟。

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)鏈接庫(kù)

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

不編譯libpomelo2自帶的openssl,因?yàn)榫幾g時(shí)會(huì)失敗。由github的OpenSSL-for-iPhone項(xiàng)目中的openssl庫(kù)替代。

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)鏈接庫(kù),適用于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. 錯(cuò)誤可以使用以下命令來(lái)查看可以使用的sdk名稱。替換命令中-sdk參數(shù)的值。

xcodebuild -sdk -version

編譯成功后,會(huì)在./build/目錄下找到編譯的靜態(tài)鏈接庫(kù),uv庫(kù)在./deps/uv/build/目錄下。

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

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

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

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

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

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

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

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

我們的libpomelo的靜態(tài)鏈接庫(kù)最好也適用各個(gè)平臺(tái),更有通用性。
當(dāng)然,如果只需要在某個(gè)平臺(tái)運(yùn)行,或者按平臺(tái)分別設(shè)置使用不同的靜態(tài)庫(kù),也可以跳過(guò)該步驟。
進(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)庫(kù)在./lib目錄下,可以用lipo -info來(lái)查看合并后靜態(tài)庫(kù)架構(gòu)信息。

二 配置Cocos2dx項(xiàng)目

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

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

此處與之前下載下來(lái)的libpomelo2庫(kù)名稱沖突,下面的配置用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平臺(tái)的編譯的便易性,建議將整理出的libpomelo2文件夾放到上面三個(gè)目錄中的一個(gè)。

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

打開(kāi)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)行需要修改兩個(gè)設(shè)置

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

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

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

至此,可以開(kāi)始在Mac,iOS模擬器,iOS設(shè)備上測(cè)試使用。

三 集成到Android平臺(tái)

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庫(kù) Android.mk是我之前的一個(gè)同事pr的,之后更新版本后這個(gè)文件就一直沒(méi)有維護(hù),所以編譯時(shí)報(bào)錯(cuò),需要我們自己修改一下。

需要修改的地方有:

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

修改后的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

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

吐槽結(jié)束。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容