Связывание Android и LuaJ 3.0

Я пишу приложение для Android, используя LuaJ 3.0. Как я могу привязать мой Java-объект к определенному LuaClosure(для всего сценария)?

Код Lua:

local  = 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);
    // binding code
    closure.call();

Я знаю, что в LuaJ 2.0(но не в 3.0) был LuaValue.setenv, а также я знаю о создании библиотек и их привязке к Globals.

1 ответ

Решение

В LuaJ 3.0 возможность изменять замыкания удалена из API. Если вы просто хотите связать свои объекты Java с определенной средой Lua, вы можете создать несколько глобальных объектов. Затем вы можете привязать свои объекты Java к определенным глобальным переменным и создать замыкание для каждого из них:

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

// binding code
mLuaGlobals1.rawset("state", CoerceJavaToLua.coerce(yourJavaObject));
mLuaGlobals2.rawset("state", CoerceJavaToLua.coerce(anotherJavaObject));
// We don't expose anything to mLuaGlobals3 in this example

// Create closures
// We use exact same prototype (script code) for each of them
LuaClosure closure1 = new LuaClosure(prototype, mLuaGlobals1);
LuaClosure closure2 = new LuaClosure(prototype, mLuaGlobals2);
LuaClosure closure3 = new LuaClosure(prototype, mLuaGlobals3);

closure1.call(); // yourJavaObject is exposed through "state" variable
closure2.call(); // anotherJavaObject is exposed through "state" variable
closure3.call(); // "state" variable is absent

Да, это глупое решение, поэтому, если вам действительно нужен контроль LuaClosure, понижение до LuaJ 2.0.3 - лучший вариант.

Другие вопросы по тегам