解压后的文件列表如下所示
其中 vsprojects 文件夹为 protobuf 的vs 工程
2. 打开 protobuf.sln 编译 工程视图如下
在 libcocos2d 项目 external 文件夹中增加新的 pcb 文件夹, 将 pbc.h 文件和 src 文件夹中的文件 拷贝到里面去,并添加到项目中 如下图
因为 libcocos2d 项目是一个 dll 项目, 所以需要导出必要的函数让 libluacocos2d 项目进行调用,导出的函数前需要增加CC_DLL 前缀。首先 增加 #include "platform/CCPlatformMacros.h", 然后将所有函数增加前缀 CC_DLL 如下图
在libluacocos2d 项目中manual 文件夹中增加新的 pbc 文件夹, 并将 pbc-lua.c 文件(从binding/lua)拷贝进去,并新增 三个用于绑定的文件 pbc-lua.h, lua_cocos2dx_pbc_manual.h, lua_cocos2dx_pbc_manual.cpp 三个文件,如下图
#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
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif
TOLUA_API int register_pbc_module(lua_State* L);
#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;
}
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 --descriptor_set_out=./Msg.pb ./Msg.proto
local pbFilePath = cc.FileUtils:getInstance():fullPathForFilename("Msg.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 = "test007",
id = 12345,
phone = {
{
number = "5885685"
},
}
})
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)
此时可以 windows 上正常使用了
下篇更新 Mac 使用 protobuf