LuaJ - 在从文件调用Lua脚本之前,在Java代码中设置package.path

时间:2014-12-28 02:50:27

标签: android luaj

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脚本中使用相对路径,这是更好的。

2 个答案:

答案 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();