I figured out how to make Lua scripts require other Lua scripts in an Android environment
但是,该解决方案在顶级Lua脚本本身中具有package.path配置。我想将package.path配置移动到运行脚本的Java代码,因为package.path特定于Android环境,而脚本可以在任何地方运行。
以下是我尝试的内容:
InputStream input getAssets().open("lua/test/pathTest.lua");
Prototype prototype = LuaC.instance.compile(input, "pathTest.lua");
Globals globals = JsePlatform.standardGlobals();
globals.load(new BaseLib());
globals.load("package.path = package.path .. ';/assets/lua/?.lua;/assets/lua/test/?.lua'");
LuaClosure c = new LuaClosure(prototype, globals);
c.call();
我还尝试过其他几种形式:
globals.load(new StringReader("package.path = package.path .. \";/assets/lua/?.lua;/assets/lua/test/?.lua\""), "pathTest.lua");
从加载中获取LuaValue结果并将其传递给LuaClosure。它们都导致脚本在第一个require
失败,无法找到引用的脚本。
有人有什么想法吗?
* edit - 如果有人知道如何将工作目录设置为/ assets / lua /文件夹,那么我可以在Lua脚本中使用相对路径,这是更好的。
答案 0 :(得分:1)
以为我之前尝试过这个,但这是解决方案。
InputStream input getAssets().open("lua/test/pathTest.lua");
Prototype prototype = LuaC.instance.compile(input, "pathTest.lua");
Globals globals = JsePlatform.standardGlobals();
globals.load(new BaseLib());
globals.load(new StringReader("package.path = '/assets/lua/?.lua;'"), "initAndroidPath").call();
LuaClosure c = new LuaClosure(prototype, globals);
c.call();
这将初始化Android环境到assets / lua /文件夹的路径。这允许我在Lua脚本中的require
调用中使用相对路径。
例如,要求子目录中的文件:assets/lua/test/luaScript.lua
Lua要求如下:
require "test.luaFile"
答案 1 :(得分:0)
在mnemy's解决方案的基础上,添加一些内容。 默认的findResource方法定义是(PS:在luaj源代码的BaseLib.java中):
public InputStream findResource(String filename) {
return getClass().getResourceAsStream(filename.startsWith("/")? filename: "/"+filename);
}
Android的getResourceAsStream方法搜索相对于android项目根目录的资源。 (我解决了链接LuaJ and Android: cannot bind class,Cloudy Zheng的解决方案的类加载器问题。) 所以,如果你想使用" requre"要在其他目录中加载其他模块(例如" / storage / emulated / 0 / temp / test / lua"),您可以像这样实现自己的findResource接口:
// Implement a finder that loads from absolute path.
public InputStream findResource(String name) {
try {
File f = new File(name);
return new FileInputStream(f);
} catch (java.io.IOException ioe) {
return null;
}
}
并设置为globals.finder。然后相应地调整搜索路径:
globals.load(new StringReader("package.path = '/storage/emulated/0/temp/test/lua/?.lua;'"), "initAndroidPath").call();