tolua_runtime 集成 lua-protobuf 第三方pb3解析庫
編譯環境
- 源碼
- 源碼下載: 從 https://github.com/topameng/tolua_runtime 下載源碼
- lua-protobuf: https://github.com/starwing/lua-protobuf 下載源碼
準備工作
命令行下跳轉到 msys2 的目錄下:如 c:msys2 目錄 cd c:msys2 執行 mingw32_shell.bat 啟動32位編譯環境,只能編譯32位的庫 執行 mingw64_shell.bat 啟動64位編譯環境,只能編譯64位的庫
32位環境和64位環境不能交叉編譯. (主要步驟)將 lua-protobuf 中的兩個文件解析文件替換到 tolua_runtime 庫中 將 pb.c 中的 luaopen_pb 函數替換為LUALIB_API int luaopen_pb(lua_State *L) {luaL_Reg libs[] = {{ "pack", Lbuf_pack },{ "unpack", Lslice_unpack },#define ENTRY(name) { #name, Lpb_##name }ENTRY(clear),ENTRY(load),ENTRY(loadfile),ENTRY(encode),ENTRY(decode),ENTRY(types),ENTRY(fields),ENTRY(type),ENTRY(field),ENTRY(typefmt),ENTRY(enum),ENTRY(defaults),ENTRY(hook),ENTRY(tohex),ENTRY(result),ENTRY(option),ENTRY(state),#undef ENTRY{ NULL, NULL }};luaL_Reg meta[] = {{ "__gc", Lpb_delete },{ "setdefault", Lpb_state },{ NULL, NULL }};if (luaL_newmetatable(L, PB_STATE)) {luaL_setfuncs(L, meta, 0);lua_pushvalue(L, -1);lua_setfield(L, -2, "__index");}#if LUA_VERSION_NUM < 502luaL_register(L, "pb", libs);#elseluaL_newlib(L, libs);#endifreturn 1;}
編譯庫
windows庫
32位
提前需要保證當前目錄下存在 Pluginsx86 目錄,不然沒有文件輸出 在 msys2的32位編譯環境中執行 ./build_win32.sh. 然后在 Pluginsx86 目錄下看見 tolua.dll 文件便編譯成功64位
提前需要保證當前目錄下存在 Pluginsx86_64 目錄,不然沒有文件輸出 在 msys2 的64位編譯環境中執行 ./build_win64.sh. 然后在 Pluginsx86_64 目錄下看見 tolua.dll 文件便編譯成功Android庫
準備環境
編譯前需要下載NDK NDK下載地址下載完成后解壓到不包含中文和空格的目錄下將 build_arm.sh , build_x86.sh , build_arm64.sh .文件中的 NDK 路徑改為自己本地存儲的路徑將 link_arm64.bat 文件中的 ndkPath 修改為上面的NDK解壓路徑下 只需要修改上面文件中的根路徑.不要修改 NDK 的版本armeabi-v7a
提前需要保證當前目錄下存在 PluginsAndroidlibsarmeabi-v7a 目錄,不然沒有文件輸出 在 msys2 的32位編譯環境中執行 ./build_arm.sh. 然后在 PluginsAndroidlibsarmeabi-v7a 目錄下看見 libtolua.so 文件便編譯成功x86
提前需要保證當前目錄下存在 PluginsAndroidlibsx86 目錄,不然沒有文件輸出 在 msys2 的32位編譯環境中執行 ./build_x86.sh. 然后在 PluginsAndroidlibsx86 目錄下看見 libtolua.so 文件便編譯成功arm64-v8a
提前需要保證當前目錄下存在 PluginsAndroidlibsarm64-v8a 目錄,不然沒有文件輸出 在 msys2 的64位編譯環境中執行 ./build_arm64.sh. 然后在 PluginsAndroidlibsarm64-v8a 目錄下看見 libtolua.so 文件便編譯成功iOS
將 tolua_runtime 工程 git clone https://github.com/topameng/tolua_runtime.git 到MAC打開終端.切換到 tolua_runtime 目錄下在終端中運行 build_ios.sh .如果遇見權限不足,用chmod +x命令提升權限然后在 PluginsiOS 目錄下看見 libtolua.a 文件便編譯成功MAC
將 tolua_runtime 工程 git clone https://github.com/topameng/tolua_runtime.git 到MAC打開終端.切換到 tolua_runtime 目錄下在終端中運行 build_osx.sh .如果遇見權限不足,用chmod +x命令提升權限然后在 Plugins 目錄下看見 tolua.bundle 庫文件便編譯成功編譯完成
在 Unity工程中的 LuaDLL.cs 中找到 luaopen_pb 函數位置將代碼替換為 /*** third party library*/[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb(IntPtr L);[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb_io(IntPtr L);[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb_conv(IntPtr L);[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb_buffer(IntPtr L);[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]public static extern int luaopen_pb_slice(IntPtr L);
找到 LuaClient.cs 或者你自己修改后的類文件中找到 OpenLibs 函數在函數的最前端加上,注意,不要刪除原來的 m_LuaState.OpenLibs(LuaDLL.luaopen_pb); // m_LuaState 為 LuaState 對象m_LuaState.OpenLibs(LuaDLL.luaopen_pb_io);m_LuaState.OpenLibs(LuaDLL.luaopen_pb_conv);m_LuaState.OpenLibs(LuaDLL.luaopen_pb_buffer);m_LuaState.OpenLibs(LuaDLL.luaopen_pb_slice);
將對應的編譯出來的庫文件替換到Unity 工程中集成驗證(在移動平臺上測試)
將 test.lua 中的代碼復制一份出來測試local pb = require "pb"local protoc = require "tolua/3rd/lua-protobuf/protoc" -- pb路徑。不要替換之前庫中的pbc-- load schema from textassert(protoc:load [[syntax = "proto3";message Phone {string name = 1;int64 phonenumber = 2;}message Person {string name = 1;int32 age = 2;string address = 3;repeated Phone contacts = 4;} ]])-- lua table datalocal data = {name = "ilse",age = 18,contacts = {{ name = "alice", phonenumber = 12312341234 },{ name = "bob", phonenumber = 45645674567 }}}-- encode lua table data into binary format in lua string and return--- 這里如果要解析 byte[] 數組, 需要將 buffer 轉換為C# 中的 LuaByteBuffer 類型-- local bytes = assert(pb.encode("Person", buffer))local bytes = assert(pb.encode("Person", data))print(pb.tohex(bytes))-- and decode the binary data back into lua tablelocal data2 = assert(pb.decode("Person", bytes))print(require "tolua/3rd/lua-protobuf/serpent".block(data2))如果可以正常打印 16進制 和 table 格式化后的表,表示集成成功
參考文檔
- https://github.com/NewbieGameCoder/tolua_runtime/wiki
- https://github.com/topameng/tolua_runtime/wiki
- http://changxianjie.com/tolua%E9%9B%86%E6%88%90lua-protobuf/
- https://www.jianshu.com/p/5a35602adef8
總結
以上是生活随笔為你收集整理的lua执行shell命令6_tolua_runtime 集成 lua-protobuf 第三方pb3解析库的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。