0

我想出了如何使 Lua 脚本在 Android 环境中需要其他 Lua 脚本

但是,该解决方案在顶级 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 脚本中使用相对路径,那就更好了。

4

2 回答 2

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/ 文件夹的路径。这允许我require在 Lua 脚本的调用中使用相对路径。

例如,要求子目录中的文件:assets/lua/test/luaScript.lua

Lua 要求看起来像:

require "test.luaFile"
于 2014-12-29T04:23:00.440 回答
0

在mnemy的解决方案的基础上,增加一些内容。默认的findResource方法定义为(PS:在luaj源码的BaseLib.java中):

public InputStream findResource(String filename) {
    return getClass().getResourceAsStream(filename.startsWith("/")? filename: "/"+filename);
}

Android 的 getResourceAsStream 方法搜索相对于 android 项目根目录的资源。(我通过链接 LuaJ 和 Android 解决了一个类加载器问题:无法绑定类,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();
于 2016-09-12T12:56:51.540 回答