Android和LuaJ 3.0绑定

我正在使用LuaJ 3.0编写Android应用程序。如何将我的Java对象绑定到特定的LuaClosure(针对整个脚本)?

Lua代码:

local state = state or nil
state.foo("some string")

Java代码:

Prototype prototype;

try{

    InputStream stream = mContext.getResources().getAssets().open(LUA_ASSETS_DIRECTORY + "test.lua");
    prototype = LuaC.compile(stream, "script");

} catch (IOException e) {

    return false;
}

LuaClosure closure = new LuaClosure(prototype, mLuaGlobals);
//绑定代码
closure.call();

我知道在LuaJ 2.0(但不是在3.0)中有LuaValue.setenv,我也知道如何创建库并将它们绑定到Globals。

点赞
用户2199970
用户2199970

从LuaJ 3.0开始,API中移除了修改闭包的能力。 如果你只是想将你的Java对象绑定到特定的Lua环境中,你可以创建多个Globals。然后将你的Java对象绑定到指定的Globals,并从每个Globals中创建一个闭包:

Globals mLuaGlobals1 = JsePlatform.standardGlobals();
Globals mLuaGlobals2 = JsePlatform.standardGlobals();
Globals mLuaGlobals3 = JsePlatform.standardGlobals();

// 绑定代码
mLuaGlobals1.rawset("state", CoerceJavaToLua.coerce(yourJavaObject));
mLuaGlobals2.rawset("state", CoerceJavaToLua.coerce(anotherJavaObject));
// 在这个例子中,我们不向mLuaGlobals3公开任何东西

// 创建闭包
// 我们使用完全相同的原型(脚本代码)来创建它们
LuaClosure closure1 = new LuaClosure(prototype, mLuaGlobals1);
LuaClosure closure2 = new LuaClosure(prototype, mLuaGlobals2);
LuaClosure closure3 = new LuaClosure(prototype, mLuaGlobals3);

closure1.call(); // yourJavaObject通过"state"变量公开
closure2.call(); // anotherJavaObject通过"state"变量公开
closure3.call(); // "state"变量不存在

是的,这是一个愚蠢的解决方案,所以如果你真的需要控制LuaClosure,请降级到LuaJ 2.0.3是最好的选择。

2013-05-29 10:36:19