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

编译环境

  • 源码

    • 源码下载: 从 https://github.com/topameng/tolua_runtime 下载源码
  • lua-protobuf: https://github.com/starwing/lua-protobuf 下载源码
  • 工具(windows)

    • 配置好的环境(建议): msys2
  • 自己配置环境(不建议): wiki

准备工作

  1. 命令行下跳转到 msys2 的目录下:如 c:msys2 目录 cd c:msys2
  2. 执行 mingw32_shell.bat 启动32位编译环境,只能编译32位的库
  3. 执行 mingw64_shell.bat 启动64位编译环境,只能编译64位的库
    32位环境和64位环境不能交叉编译.
  4. (主要步骤)将 lua-protobuf 中的两个文件解析文件替换到 tolua_runtime 库中
  5. 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位

  1. 提前需要保证当前目录下存在 Pluginsx86 目录,不然没有文件输出
  2. msys2的32位编译环境中执行 ./build_win32.sh.
  3. 然后在 Pluginsx86 目录下看见 tolua.dll 文件便编译成功

64位

  1. 提前需要保证当前目录下存在 Pluginsx86_64 目录,不然没有文件输出
  2. msys2 的64位编译环境中执行 ./build_win64.sh.
  3. 然后在 Pluginsx86_64 目录下看见 tolua.dll 文件便编译成功

Android库

准备环境

  1. 编译前需要下载NDK NDK下载地址
  2. 下载完成后解压到不包含中文和空格的目录下
  3. build_arm.sh , build_x86.sh , build_arm64.sh .文件中的 NDK 路径改为自己本地存储的路径
  4. link_arm64.bat 文件中的 ndkPath 修改为上面的NDK解压路径下 只需要修改上面文件中的根路径.不要修改 NDK 的版本

armeabi-v7a

  1. 提前需要保证当前目录下存在 PluginsAndroidlibsarmeabi-v7a 目录,不然没有文件输出
  2. msys2 的32位编译环境中执行 ./build_arm.sh.
  3. 然后在 PluginsAndroidlibsarmeabi-v7a 目录下看见 libtolua.so 文件便编译成功

x86

  1. 提前需要保证当前目录下存在 PluginsAndroidlibsx86 目录,不然没有文件输出
  2. msys2 的32位编译环境中执行 ./build_x86.sh.
  3. 然后在 PluginsAndroidlibsx86 目录下看见 libtolua.so 文件便编译成功

arm64-v8a

  1. 提前需要保证当前目录下存在 PluginsAndroidlibsarm64-v8a 目录,不然没有文件输出
  2. msys2 的64位编译环境中执行 ./build_arm64.sh.
  3. 然后在 PluginsAndroidlibsarm64-v8a 目录下看见 libtolua.so 文件便编译成功

iOS

  1. tolua_runtime 工程 git clone https://github.com/topameng/tolua_runtime.git 到MAC
  2. 打开终端.切换到 tolua_runtime 目录下
  3. 在终端中运行 build_ios.sh .如果遇见权限不足,用chmod +x命令提升权限
  4. 然后在 PluginsiOS 目录下看见 libtolua.a 文件便编译成功

MAC

  1. tolua_runtime 工程 git clone https://github.com/topameng/tolua_runtime.git 到MAC
  2. 打开终端.切换到 tolua_runtime 目录下
  3. 在终端中运行 build_osx.sh .如果遇见权限不足,用chmod +x命令提升权限
  4. 然后在 Plugins 目录下看见 tolua.bundle 库文件便编译成功

编译完成

  1. 在 Unity工程中的 LuaDLL.cs 中找到 luaopen_pb 函数位置
  2. 将代码替换为
        /*** 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);

  1. 找到 LuaClient.cs 或者你自己修改后的类文件中找到 OpenLibs 函数
  2. 在函数的最前端加上,注意,不要删除原来的 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);

  1. 将对应的编译出来的库文件替换到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解析库相关推荐

  1. lua执行shell命令6_Vim执行shell命令及使用Vim批量更改文件名

    写在前面:我"胡汉三"又回来了~上周顺利通过了试用期答辩,现在俺是一名正式的鹅厂人啦.哈哈哈~感谢各位可爱又热心的好伙伴对我的"不离不弃". 话休絮烦,今天分享 ...

  2. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

  3. jenkins 插件执行shell命令时,提示“Command not found”处理方法

    首先提示找不到"Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具 ...

  4. linux c 执行shell命令并获取返回结果

    最近在项目中用到了C语言执行shell命令的问题,调查了一下,一般有system函数.exec族函数,但是还不太清楚怎么获取shell命令执行的返回信息. 例如执行一个ifconfig命令,肯定需要获 ...

  5. vim中执行shell命令小结

    vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如 :!ls - ...

  6. python调用shell命令-在Python中执行shell命令的6种方法,你都知道吗?

    原标题:在Python中执行shell命令的6种方法,你都知道吗? Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库.今天我们就讲解 ...

  7. python调用shell命令-python中执行shell命令的几个方法小结

    最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 复制代码 代码如下: os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0或 ...

  8. python 执行shell命令行效率提升_在python脚本中执行shell命令的方法

    使用Python处理一个shell命令或一个执行一个shell脚本,一般情况下,有以下三种方法,以下我们来看: 第一种方法是使用os.system的方法 os.system(" cmd&qu ...

  9. Android执行shell命令

    Android执行shell命令 一.方法 /** * 执行一个shell命令,并返回字符串值 * * @param cmd * 命令名称&参数组成的数组(例如:{"/system/ ...

最新文章

  1. django中的ajax_post请求
  2. 跨域访问被禁止的演示示例
  3. ARM汇编学习-工具篇
  4. C语言程序设计谭浩强(第四版)期末复习重点
  5. 传奇服务器修改npc外观,传奇NPC里面图片修改方法
  6. EXCEL选择下拉框实现复选
  7. 原来创业也可以这样:80后乞丐网上卖烧烤 500元起家赚了400万
  8. Android答题系统
  9. Docker Mysql使用学习
  10. 【Android视频 之 阿里云视频播放器 二】
  11. 蓄电池内阻的检测技术
  12. 计算机课程中常用的高中数学公式
  13. C语言如何实现辗转相除法
  14. Python PEP—Python增强提案
  15. WPF 如何画出1像素的线
  16. SpringBoot之配置文件,带你全面掌握高级知识点
  17. 硬件架构“变天”了,不能只见树木不见森林
  18. 2022.11.17补题祭
  19. Keras学习笔记11——keras.applications
  20. 用java实现Simsimi小黄鸡接口

热门文章

  1. [导入]对iis写权限的利用
  2. 01Spring的helloworld程序
  3. 【idea中debug的使用】
  4. java gettext用法_Java Context.getText方法代码示例
  5. 【C语言】有3个数a,b,c,要求按大小顺序把它们输出(基础法)
  6. Java黑皮书课后题第10章:**10.28(实现StringBuilder类)在Java库中提供了StringBuilder类。给出你对下面方法的实现(将新类命名为MyStringBuilder2)
  7. Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数
  8. 在计算机中 鼠标器属于,在计算机中,鼠标器属于()。
  9. Shell-11--for
  10. vs编译应用程序不依赖运行vs环境