需要准备:
一、将lua-protobuf的pb.h和pb.c替换tolua_runtime根目录的pb.c
二、打开pb.c替换luaop_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 < 502 luaL_register(L, "pb", libs);
#else luaL_newlib(L, libs);
#endif
return 1;
}三、编译
打开msys2 32编译环境 cd到tolua_runtime位置
./build_win32.sh 编译win的tolua.dll,目录在Plugins/x86下
打开编辑android相关的(build_arm.sh、build_x86.sh、link_arm64.bat),把NDK路径改为本电脑路径,我用的版本是android-ndk-r10e-windows-x86_64,然后在msys2 的32位下执行 ./build_arm.sh,执行./build_x86.sh。编译后的tolua.so在Plugins/Android下
arm64的参考上面步骤,使用msys2 64编译环境
ios和mac没试,需要MAC系统,没条件的可以搞虚拟机弄弄,用终端直接执行相关脚本。
四、库的使用
1.在Unity中找到LuaDLL.cs,找到lua_open_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);
2.在你创建虚拟机的地方添加打开Lib
// 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);
3.复制lua-protobuf的protoc.lua和serpent.lua到你的lua脚本目录