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上失败,无法找到引用的脚本。
有人有什么想法吗?
*编辑--如果有人知道如何将工作目录设置为/assets/ Lua /文件夹,那么我可以在Lua脚本中使用相对路径,这将是更好的选择。
发布于 2014-12-29 04:23:00
我以为我以前试过这个,但这是个解决办法。
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环境到资产/lua/文件夹的路径。这允许我在Lua脚本中的require调用中使用相对路径。
例如,需要子目录中的文件:assets/lua/test/luaScript.lua
Lua的要求看起来应该是:
require "test.luaFile"发布于 2016-09-12 12:56:51
在此基础上,增加了一些内容。默认的findResource方法定义是(在luaj源代码的BaseLib.java中):
public InputStream findResource(String filename) {
return getClass().getResourceAsStream(filename.startsWith("/")? filename: "/"+filename);
}android的getResourceAsStream方法相对于android项目的根目录搜索资源。(我用Cloudy郑的解决方案--链接LuaJ and Android: cannot bind class解决了类加载程序问题。)因此,如果您想使用"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();https://stackoverflow.com/questions/27673328
复制相似问题