首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LuaJ -在调用文件中的Lua脚本之前先用package.path设置

LuaJ -在调用文件中的Lua脚本之前先用package.path设置
EN

Stack Overflow用户
提问于 2014-12-28 02:50:26
回答 2查看 1.1K关注 0票数 0

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环境的,而脚本可以在任何地方运行。

以下是我尝试过的:

代码语言:javascript
复制
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();

我也尝试过其他一些形式,比如:

代码语言:javascript
复制
globals.load(new StringReader("package.path = package.path .. \";/assets/lua/?.lua;/assets/lua/test/?.lua\""), "pathTest.lua");

或者从加载中获取LuaValue结果并将其传递给LuaClosure。它们都会导致脚本在第一个require上失败,无法找到引用的脚本。

有人有什么想法吗?

*编辑--如果有人知道如何将工作目录设置为/assets/ Lua /文件夹,那么我可以在Lua脚本中使用相对路径,这将是更好的选择。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-29 04:23:00

我以为我以前试过这个,但这是个解决办法。

代码语言:javascript
复制
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的要求看起来应该是:

代码语言:javascript
复制
require "test.luaFile"
票数 1
EN

Stack Overflow用户

发布于 2016-09-12 12:56:51

在此基础上,增加了一些内容。默认的findResource方法定义是(在luaj源代码的BaseLib.java中):

代码语言:javascript
复制
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接口:

代码语言:javascript
复制
// 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。然后相应地调整搜索路径:

代码语言:javascript
复制
globals.load(new StringReader("package.path = '/storage/emulated/0/temp/test/lua/?.lua;'"), "initAndroidPath").call();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27673328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档