Cocos2d-x集成libpomelo
版本信息
cocos2dx版本 3.11.1
libpomelo2版本为0.3.5
操作系统 OS X 10.11.4
一 生成libpomelo2的静态链接库
1. 获取libpomelo2源码
git clone https://github.com/NetEase/libpomelo2.git
2.获取gyp源码并安装
如果已经安装gyp,请略过该步骤。
git clone https://github.com/martine/gyp.git
cd gyp
python setup.py
3.生成libpomelo2项目
进入libpomelo2目录,使用gyp生成xcode项目。设置参数不使用tls
和不使用系统的openssl
gyp --depth=. pomelo.gyp -Duse_sys_openssl=false -Dno_tls_support=true -Dpomelo_library=static_library
如果目录中生成pomelo.xcodeproj
则生成项目成功。
4.编译静态链接库
编译架构(Architectures)为armv7
和arm64
的libpomelo2静态链接库,适用于iOS设备。
不编译libpomelo2自带的openssl
,因为编译时会失败。由github的OpenSSL-for-iPhone
项目中的openssl
库替代。
xcodebuild -project pomelo.xcodeproj -target libpomelo2 -sdk iphoneos9.3
xcodebuild -project deps/uv/uv.xcodeproj -target libuv -sdk iphoneos9.3
编译架构(Architectures)为i386
和x_86
的libpomelo2静态链接库,适用于Mac,PC以及Android。
xcodebuild -project pomelo.xcodeproj -target libpomelo2 -sdk iphonesimulator9.3
xcodebuild -project deps/uv/uv.xcodeproj -target libuv -sdk iphonesimulator9.3
如果出现 xcodebuild: error: SDK "iphoneos9.3" cannot be located.
错误可以使用以下命令来查看可以使用的sdk名称。替换命令中-sdk
参数的值。
xcodebuild -sdk -version
编译成功后,会在./build/
目录下找到编译的静态链接库,uv
库在./deps/uv/build/
目录下。
可以使用lipo
命令查看静态链接库的信息。
例如:
lipo -info xxx.a;
打印信息:
Architectures in the fat file: xxx.a are: armv7 arm64
编译openssl静态库
获取OpenSSL-for-iPhone项目源码
https://github.com/x2on/OpenSSL-for-iPhone.git
进入目录,执行编译脚本
cd OpenSSL-for-iPhone
./build-libssl.sh
编译成功后,会在./lib/
目录下找到libpomelo2需要的libssl.a
和libcrypto.a
两个静态库。使用lipo -info
命令会发现这两个库已经适用i386 armv7 armv7s x86_64 arm64
。
合并静态链接库
我们的libpomelo的静态链接库最好也适用各个平台,更有通用性。
当然,如果只需要在某个平台运行,或者按平台分别设置使用不同的静态库,也可以跳过该步骤。
进入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
合并之后的静态库在./lib
目录下,可以用lipo -info
来查看合并后静态库架构信息。
二 配置Cocos2dx项目
新建一个cocos2dx项目
cocos new Cocos2dx_pomelo -l cpp
整理libpomelo2文件
新建一个目录命名为libpomelo2,用于放置静态链接库和头文件。
此处与之前下载下来的libpomelo2
库名称冲突,下面的配置用libpomelo2文件夹
和libpomelo2项目
用以区分。
- 复制
OpenSSL-for-iPhone
项目中的include/openssl
文件夹 到libpomelo2/include
- 复制
libpomelo2
项目中的deps/uv/include
文件夹中的所有文件 到libpomelo2/include
- 复制
libpomelo2
项目中的include
文件夹中的所有文件 到libpomelo2/include
- 复制编译好的
libcrypto.a libpomelo2.a libssl.a libuv.a
到libpomelo2/prebuild
目录结构:
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项目
拷贝libpomelo2文件夹到Cocos2dx_pomelo的项目目录中。
因为cocos2d-x的Android编译脚本android-build.py
中设置的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
目录来设置。
打开Xcode项目文件Cocos2dx_pomelo.xcodeproj
- 在项目中添加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设备运行需要修改两个设置
-
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设备上测试使用。
三 集成到Android平台
1.继续整理libpomelo2文件夹
- 复制
libpomelo2
项目中的deps/uv
文件夹中 到libpomelo2/deps/
- 复制
libpomelo2
项目中Android.mk
文件 到libpomelo2/
- 复制
libpomelo2
项目中CMakeLists.txt
文件 到libpomelo2/
- 复制
libpomelo2
项目中src
文件夹 到libpomelo2/
整理后的目录结构:
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的,之后更新版本后这个文件就一直没有维护,所以编译时报错,需要我们自己修改一下。
需要修改的地方有:
- LOCAL_SRC_FILES 这里需要列出
libpomelo2/src
中所有的.c
文件 - 删除废弃使用的静态库配置
修改后的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)
进入Cocos2dx_pomelo项目文件夹,编译Android
cocos run -p android
另外说一下,pomelo本来就是网易内部自用的东西,开源的过程中也是你能用就用,不能用就别用的心态。所以也不要奢求有什么文档,及时更新及时修复bug这些要求,这也从一个角度反映出中国公司对待开源项目的普遍态度。
Cocos2d-x也是个笑话,看产品过程就知道公司是什么样子,折腾来折腾去的来证明自己能力有限。最后干脆以Unity3D为榜样,开始抄人家的架构和编辑器。最后结果可能还是会证明,触控能力有限,本来就是一家三流公司,非要装国际化大公司。
吐槽结束。