网上看了一些资料但还是遇到不少问题。在这里记录一下

下载地址:
https://github.com/sean-lin/protoc-gen-lua.git
1. 复制文件 protoc-gen-lua/protobuf/pb.c 到 frameworks\cocos2d-x\external\lua\protobuf\pb.c
2. 修改 frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\network\lua_extensions.c 文件
#include”lua_extensions.h”

if __cplusplus
extern “C” {
#endif
// socket
#include”protobuf/pb.c”
#include”luasocket/luasocket.h”
#include”luasocket/luasocket_scripts.h”
#include”luasocket/mime.h”
static luaL_Reg luax_exts[] = {
{“socket.core”, luaopen_socket_core},
{“mime.core”, luaopen_mime_core},
{NULL, NULL}
};

voidluaopen_lua_extensions(lua_State L){
// load extensions
luaL_Reg
lib = luax_exts;
lua_getglobal(L, “package”);
lua_getfield(L, -1, “preload”);
for (; lib->func; lib++)
{
lua_pushcfunction(L, lib->func);
lua_setfield(L, -2, lib->name);
}
lua_pop(L, 2);

luaopen_luasocket_scripts(L);
luaopen_pb(L);
}

if __cplusplus
} // extern “C”
#endif
3.重新编译工程C库。 测试 require “pb”应该OK了
4.复制 protoc-gen-lua/protobuf/.lua 所有文件 到工程里面。src\network\protobuf\src
5. 运行测试lua 脚本 应该没问题了。
在第3步编译工程中报 uint_t错误。需要修改下pb.c文件
staticintstruct_unpack(lua_State
L){
uint8_t format = luaL_checkinteger(L, 1);
size_t len;
size_t pos = luaL_checkinteger(L, 3);
const uint8_t buffer = (uint8_t)luaL_checklstring(L, 2, &len) + pos;
另外如果因为LUA module 出错,需要用全局变量来设定。
测试代码
functionMainScene:testdata()
—local sp = require(“player”)
—dump(sp[1])
local person= person_pb.Person()
person.id = 1000
person.name = “Alice”
person.email = “Alice@example.com”

local home = person.Extensions[person_pb.Phone.phones]:add()
home.num = “2147483647”
home.type = person_pb.Phone.HOME

local data = person:SerializeToString()

local msg = person_pb.Person()

msg:ParseFromString(data)
print(“parser:”, msg.id, msg.name, msg.email, data)
print(msg)

end