cocos2d-x首页投稿(暂停使用,暂停投稿)程序员

Cocos2d-x集成libpomelo

2016-05-16  本文已影响1292人  shy0218

版本信息

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)为armv7arm64的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)为i386x_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.alibcrypto.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项目用以区分。

目录结构:

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

注意:iOS设备运行需要修改两个设置

在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
├── 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的,之后更新版本后这个文件就一直没有维护,所以编译时报错,需要我们自己修改一下。

需要修改的地方有:

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

修改后:

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为榜样,开始抄人家的架构和编辑器。最后结果可能还是会证明,触控能力有限,本来就是一家三流公司,非要装国际化大公司。

吐槽结束。

上一篇下一篇

猜你喜欢

热点阅读