版本信息
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)為armv7
和arm64
的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)為i386
和x_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.a
和libcrypto.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.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平臺的編譯的便易性蝶缀,建議將整理出的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é)束认烁。