cocos2dx 3.x 集成protobuf


vs2013+cocos2dx 3.13.1

這篇博文是集成Lua版本的protobuf,集成C++版本的過程也可參考。

主要參考博文地址《cocos2dx 3.x C++搭建protobuf環境》,這里的集成方式和參考博文有點不一樣(這里是直接集成到引擎中,參考博文是當成一個庫放到項目中),請仔細甄別。

 

1.下載pbc

①下載地址 pbc:https://github.com/cloudwu/pbc

②解壓后的文件列表,我們所需要的就是如下圖的三個文件(夾)里的文件。(其中binding文件夾中包含了lua和lua53兩個文件夾,因為cocos2dx集成的lua版本是5.1,所以我們使用lua文件夾,而不用lua53文件夾)

③其實就分兩部分,一部分是C++部分(pbc.h和src文件夾),一部分就是C++綁定到lua部分(binding文件夾中lua文件夾)

 

2.將C++部分的代碼集成到libcocos2d項目中

①在libcocos2d項目external文件夾中增加新的pbc文件夾,將pbc.h文件和src文件夾中的文件拷貝到里面去,並添加到項目中

 

②修改pbc.h文件

因為libcocos2d項目是一個dll項目,所以需要導出必要的函數讓libluacocos2d項目進行調用,導出的函數前需要增加CC_DLL前綴。

首先include相應頭文件,因為CC_DLL的定義在CCPlatformMacros.h中

 

然后給所有(所有!)函數前增加CC_DLL前綴,如下圖只羅列了其中幾個

 

③編譯libcocos2d項目 

 

3.將C++綁定到lua部分集成到libluacocos2d項目中

①在libluacocos2d項目中manual文件夾中增加新的pbc文件夾,並將pbc-lua.c文件拷貝(從bunding/lua中拷貝)進去,並新增(新增!)三個用於綁定的文件pbc-lua.h/lua_cocos2dx_pbc_manual.h/lua_cocos2dx_pbc_manual.cpp。如下圖

 

②修改pbc-lua.c文件(只修改前面部分),入下圖

 

③pbc-lua.h內容

#pragma once #ifdef __cplusplus extern "C" { #endif #include "lua.h" #include "lualib.h" #include "lauxlib.h" #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif
    int luaopen_protobuf_c(lua_State *L); #ifdef __cplusplus } #endif

 

④lua_cocos2dx_pbc_manual.h內容

#pragma once #ifdef __cplusplus extern "C" { #endif #include "tolua++.h" #ifdef __cplusplus } #endif TOLUA_API int  register_pbc_module(lua_State* L);

 

⑤lua_cocos2dx_pbc_manual.cpp內容

#include "scripting/lua-bindings/manual/pbc/lua_cocos2dx_pbc_manual.h" #include "platform/CCPlatformConfig.h" #include "base/ccConfig.h" #include "scripting/lua-bindings/manual/tolua_fix.h" #include "scripting/lua-bindings/manual/LuaBasicConversions.h" #include "scripting/lua-bindings/manual/CCLuaEngine.h" #include "scripting/lua-bindings/manual/pbc/pbc-lua.h" #include "cocos/platform/CCFileUtils.h"

int read_protobuf_file(lua_State *L){ const char *buff = luaL_checkstring(L, -1); Data data = cocos2d::FileUtils::getInstance()->getDataFromFile(buff); lua_pushlstring(L, (const char*)data.getBytes(), data.getSize()); return 1; } TOLUA_API int register_pbc_module(lua_State* L) { lua_getglobal(L, "_G"); if (lua_istable(L, -1))//stack:...,_G,
 { lua_register(L, "read_protobuf_file_c", read_protobuf_file); luaopen_protobuf_c(L); } lua_pop(L, 1); return 1; }

 

⑥在cocos2d-x\cocos\scripting\lua-bindings\manual\lua_module_register.cpp中進行注冊

⑦編譯libluacocos2d項目

 

以上,lua的在項目中的集成就完成了。下面來進行lua項目的驗證。

 

4.在lua項目中的使用

①在bunding/lua中拷貝兩個文件parser.lua/protobuf.lua到lua項目src中,然后在init.lua中進行require。

 

 

②定義MsgProtocol.proto文件

message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; }

 

③使用protoc.exe(這個工具需要到protobuf官方網站下載或者編譯得到 官網:https://github.com/google/protobuf/releases)生成MsgProtocol.pb文件

protoc.exe --descriptor_set_out=./MsgProtocol.pb ./MsgProtocol.proto

 

④將生成的MsgProtocol.pb放到資源res文件夾中!

 

⑤相關驗證使用的Lua代碼

local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename("MsgProtocol.pb") release_print("PB file path: "..pbFilePath) local buffer = read_protobuf_file_c(pbFilePath) protobuf.register(buffer) --注:protobuf 是因為在protobuf.lua里面使用module(protobuf)來修改全局名字
    
    local stringbuffer = protobuf.encode("Person", { name = "Alice", id = 12345, phone = { { number = "87654321" }, } }) local slen = string.len(stringbuffer) release_print("slen = "..slen) local temp = ""
    for i=1, slen do temp = temp .. string.format("0xX, ", string.byte(stringbuffer, i)) end release_print(temp) local result = protobuf.decode("Person", stringbuffer) release_print("result name: "..result.name) release_print("result name: "..result.id)

 

⑥輸出正確的結果

 

5.在windows上是能正確使用了,下面內容為修改mk文件,讓protobuf在android上也能正常使用。

①修改libcocos2d項目對應的cocos2d-x\cocos\Android.mk文件,增加對應文件引用。

 

②修改libluacocos2d項目對應的cocos2d-x\cocos\scripting\lua-bindings\proj.android\Android.mk文件,增加對應文件引用。

 

③android上正常編譯完成。

 

以上,完。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM