本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Android 和 LuaJ 3.0 绑定

发布于2025-01-18 21:49     阅读(160)     评论(0)     点赞(27)     收藏(3)


我正在使用 LuaJ 3.0 编写 Android 应用程序。如何将 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。


解决方案


从 LuaJ 3.0 开始,API 中不再提供修改闭包的功能。如果您只想将 Java 对象绑定到特定的 Lua 环境,则可以创建多个Globals。然后,您可以将 Java 对象绑定到特定的 Globals ,并从每个 Globals 创建一个闭包:

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 是最好的选择。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.javaheidong.com/blog/article/695236/0cc5f0be6c472e1c87e6/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)