日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lua执行shell命令6_tolua_runtime 集成 lua-protobuf 第三方pb3解析库

發布時間:2024/4/19 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lua执行shell命令6_tolua_runtime 集成 lua-protobuf 第三方pb3解析库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

tolua_runtime 集成 lua-protobuf 第三方pb3解析庫

編譯環境

  • 源碼
    • 源碼下載: 從 https://github.com/topameng/tolua_runtime 下載源碼

    • lua-protobuf: https://github.com/starwing/lua-protobuf 下載源碼

  • 工具(windows)
    • 配置好的環境(建議): msys2

    • 自己配置環境(不建議): wiki

準備工作

  • 命令行下跳轉到 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解析库的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。