Java如何调用Lua脚本

背景描述:
最近工作遇到一个需求就是我们java程序需要调用之前lua写的脚本程序由于之前没有接触过lua脚本调用,
于是找了大量资料发现使用LuaJ就可以,但是遇到了一个问题就是当Java调用普通lua文件时没有问题可以正常返回结果
但是当调用lua文件内require了其他模块的时候总是会报错,苦思不得其解,望能指教一下
LuaJ使用版本为3.0.1 也使用过2.0.3

下图为Java调用代码

img

下图为:报错信息

img

下图为:Lua脚本

img

另外lua文件与被应用模块均在一个目录下

可以尝试在java代码中添加LuaJ的addPackagePath方法,把lua文件所需要的其他模块的路径加入进去,再调用lua文件看看是否能正常返回结果。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
当Lua脚本调用其他模块时,需要确保被调用的模块能够正确地被Lua解释器找到并加载。如果你使用的是LuaJ,可以考虑使用LuaC来将Lua脚本编译为字节码,这样可以提高脚本的执行效率,并且可以避免一些由于模块找不到而引发的问题。
-
另外,当Lua脚本调用其他模块时,需要确保模块的路径被正确地设置。可以通过设置package.path来指定模块的路径,或者通过设置package.cpath来指定C模块的路径。

以下是一个使用LuaJ调用Lua脚本并指定模块路径的示例代码:

// 创建一个Lua解释器
LuaState luaState = LuaStateFactory.newLuaState();

try {
    // 加载Lua脚本
    luaState.LdoString("require('test')");

    // 设置模块路径
    luaState.getGlobal("package");
    luaState.pushString("/path/to/modules/?.lua");
    luaState.setField(-2, "path");
    luaState.pop(1);

    // 调用Lua函数
    luaState.getGlobal("foo");
    luaState.pushNumber(123);
    luaState.pushString("hello");
    luaState.call(2, 1);

    // 获取返回值
    String result = luaState.toString(-1);
    System.out.println(result);
} finally {
    // 关闭Lua解释器
    luaState.close();
}


在上面的示例代码中,require('test')表示加载一个名为test的Lua模块。模块路径/path/to/modules/?.lua表示模块的路径是/path/to/modules/,模块名是.lua。foo表示Lua脚本中的一个函数名。123和"hello"是传递给函数的参数。call(2, 1)表示调用函数并期望它返回一个值。toString(-1)表示获取栈顶的返回值并将其转换为字符串类型。