两种思路:
1、LuaJit 转luac,生成的bytecode,是按照32位生成的。在64位的机器上是不支持的。(新版本的LuaJit 已经支持了64位。可更新新版本的LuaJit, 用新版本LuaJit生成对应的luajit-mac)
2、原生的Lua5.1.4 生成的bytecode,在64位机器上,是按照64位生成的,在32位的机器上是不支持的。(可以更改Lua和生成Luac的代码,即可同时支持32位与64的问题)
根据分析代码发现,主要是由于size_t这个类型(size_t 在32位架构上是4字节,在64位架构上是8字节)导致生成的bytecode在32位与64位不兼容的问题。故可以将生成bytecode 与加载bytecode 的地方,均换成固定大小的int即可解决问题。
具体修改如下:
ldump.c 生成bytecode。static void DumpString(const TString* s, DumpState* D) 中 size_t 换成 int。
lundump.c 加载解析bytecode。 static TString* LoadString(LoadState* S) 中 size_t 换成 init。
luac 文件头部数据 void luaU_header (char* h) 中 size_t 换成 int。
unity的ulua 使用的是LuaJit。可通过更新LuaJit 解决64位的问题。
Android 机器只有带arm64为64位机器。其他的都是32位机器。
LuaJit字节码有以下特点:
- 使用lua编译出来的字节码和luajit的字节码不兼容
- 32位和64位的生成的字节码不兼容
- 不同版本的luajit的字节码可能不兼容