版本信息
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)為armv7和arm64的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)為i386和x_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.a和libcrypto.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.a到libpomelo2/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é)束。