網上看了一些資料但仍是遇到很多問題。在這裏記錄一下 git
下載地址: github
https://github.com/sean-lin/protoc-gen-lua.git socket
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 文件 ui
#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} }; void luaopen_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了 lua
4.複製 protoc-gen-lua/protobuf/*.lua 全部文件 到工程裏面。src\network\protobuf\src spa
5. 運行測試lua 腳本 應該沒問題了。 code
在第3步編譯工程中報 uint_t錯誤。須要修改下pb.c文件 orm
static int struct_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 出錯,須要用全局變量來設定。 ip
測試代碼
function MainScene: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