Cocos2d-x集成libpomelo

作者: shy0218 | 来源:发表于2016-05-16 10:38 被阅读1292次

    版本信息

    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项目用以区分。

    • 复制OpenSSL-for-iPhone项目中的 include/openssl文件夹 到 libpomelo2/include
    • 复制libpomelo2项目中的 deps/uv/include文件夹中的所有文件 到 libpomelo2/include
    • 复制libpomelo2项目中的 include文件夹中的所有文件 到 libpomelo2/include
    • 复制编译好的libcrypto.a libpomelo2.a libssl.a libuv.alibpomelo2/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为榜样,开始抄人家的架构和编辑器。最后结果可能还是会证明,触控能力有限,本来就是一家三流公司,非要装国际化大公司。

    吐槽结束。

    相关文章

      网友评论

      • 无名_4ab3:对libpomelo熟悉吗?知道libpomelo2是否支持ipv6不?

      本文标题:Cocos2d-x集成libpomelo

      本文链接:https://www.haomeiwen.com/subject/lrlbrttx.html