发布于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黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!