如何在LuaJ中执行编译后的Lua脚本并且使用自定义全局环境调用函数?

我有一个使用ScriptEngine预编译的Lua脚本。

private void preCompile(){
    ScriptEngineManager manager = new ScriptEngineManager();
    engine = manager.getEngineByName("luaj");
    if(engine instanceof Compilable){
        try {
            compScript = ((Compilable)engine).compile(scriptContent);
        }catch (ScriptException se){
            System.err.println(se.getMessage());
        }
    }else{
        System.err.println("引擎无法编译代码!");
    }

我也可以使用eval()函数执行它,并使用LuaFunction.invoke(LuaValue)调用脚本中的函数。

public Object callFunction(String funcName, Object[] args){
    preCompile();
    Bindings script_bindings = new SimpleBindings();
    try{
        compScript.eval(script_bindings);
        LuaFunction luafunc = (LuaFunction)script_bindings.get(funcName);
        LuaValue[] luaValues = new LuaValue[args.length];
        for(int i = 0; i < args.length; ++i){
            luaValues[i] = CoerceJavaToLua.coerce(args[i]);
        }
        result = luafunc.invoke(luaValues);
    }catch (ScriptException se){
        System.out.println(se.getMessage());
    }
    return result;
}

问题在这里:

我可以使用Java API执行脚本,但是我想做的是通过使用Global创建一个自定义环境。

因此,我创建了Global对象并加载了所需的库,如下所示:

private void LoadScript(){
    globals = new Globals();
    globals.load(new JseBaseLib());
    globals.load(new PackageLib());
    globals.load(new StringLib());
    globals.load(new Bit32Lib());
    globals.load(new TableLib());
    LoadState.install(globals);
    LuaC.install(globals);

现在,我只是不知道如何将'globals'链接到已编译的文件(compScript)。我尝试过全局已编译函数

Prototype chunk = globals.compilePrototype(new StringReader(script), "script");

可以使用chunk.call()执行脚本,但我仍然不知道如何在我的自定义'globals'环境中调用脚本中的函数(带或不带参数)'chunk'或'compScript'。

此外,“globals.load()”函数是否编译脚本文件?我只想编译一次脚本并重复使用。

点赞
用户11110585
用户11110585

该代码块必须用 globals.load 获取。然后您可以 call 该代码块,并从全局变量中获取所需的 Lua 函数,假设您的函数已定义为全局变量。如果它是 local,则无法使用它。

LuaValue chunk = globals.load(script, "script");
chunk.call();
LuaValue func = globals.get(functionName);
func.call(args);
2019-02-24 21:12:22
用户10799096
用户10799096

LuajContext 公开了一个名为 globals 的值 (来源代码参考). 通过从引擎中获取上下文并将其转换为 LuajContext,可以使用此表格(顺便说一下,您不需要创建自己的全局变量; 默认在上下文的构造函数中构造)

LuajContext context = (LuajContext) e.getContext();
System.out.println(context.globals);
2023-01-05 06:11:55