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解析库相关推荐
- lua执行shell命令6_Vim执行shell命令及使用Vim批量更改文件名
写在前面:我"胡汉三"又回来了~上周顺利通过了试用期答辩,现在俺是一名正式的鹅厂人啦.哈哈哈~感谢各位可爱又热心的好伙伴对我的"不离不弃". 话休絮烦,今天分享 ...
- java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例
java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...
- jenkins 插件执行shell命令时,提示“Command not found”处理方法
首先提示找不到"Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具 ...
- linux c 执行shell命令并获取返回结果
最近在项目中用到了C语言执行shell命令的问题,调查了一下,一般有system函数.exec族函数,但是还不太清楚怎么获取shell命令执行的返回信息. 例如执行一个ifconfig命令,肯定需要获 ...
- vim中执行shell命令小结
vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如 :!ls - ...
- python调用shell命令-在Python中执行shell命令的6种方法,你都知道吗?
原标题:在Python中执行shell命令的6种方法,你都知道吗? Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库.今天我们就讲解 ...
- python调用shell命令-python中执行shell命令的几个方法小结
最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 复制代码 代码如下: os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0或 ...
- python 执行shell命令行效率提升_在python脚本中执行shell命令的方法
使用Python处理一个shell命令或一个执行一个shell脚本,一般情况下,有以下三种方法,以下我们来看: 第一种方法是使用os.system的方法 os.system(" cmd&qu ...
- Android执行shell命令
Android执行shell命令 一.方法 /** * 执行一个shell命令,并返回字符串值 * * @param cmd * 命令名称&参数组成的数组(例如:{"/system/ ...
最新文章
- django中的ajax_post请求
- 跨域访问被禁止的演示示例
- ARM汇编学习-工具篇
- C语言程序设计谭浩强(第四版)期末复习重点
- 传奇服务器修改npc外观,传奇NPC里面图片修改方法
- EXCEL选择下拉框实现复选
- 原来创业也可以这样:80后乞丐网上卖烧烤 500元起家赚了400万
- Android答题系统
- Docker Mysql使用学习
- 【Android视频 之 阿里云视频播放器 二】
- 蓄电池内阻的检测技术
- 计算机课程中常用的高中数学公式
- C语言如何实现辗转相除法
- Python PEP—Python增强提案
- WPF 如何画出1像素的线
- SpringBoot之配置文件,带你全面掌握高级知识点
- 硬件架构“变天”了,不能只见树木不见森林
- 2022.11.17补题祭
- Keras学习笔记11——keras.applications
- 用java实现Simsimi小黄鸡接口
热门文章
- [导入]对iis写权限的利用
- 01Spring的helloworld程序
- 【idea中debug的使用】
- java gettext用法_Java Context.getText方法代码示例
- 【C语言】有3个数a,b,c,要求按大小顺序把它们输出(基础法)
- Java黑皮书课后题第10章:**10.28(实现StringBuilder类)在Java库中提供了StringBuilder类。给出你对下面方法的实现(将新类命名为MyStringBuilder2)
- Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数
- 在计算机中 鼠标器属于,在计算机中,鼠标器属于()。
- Shell-11--for
- vs编译应用程序不依赖运行vs环境