尝试通过Android访问资产中的Lua脚本

我最近尝试将我正在开发的一个引擎移植到Android上,并在尝试在Lua脚本中使用"require"或"dofile"时遇到了一些问题。

(快速说明:这是在C++11中编写的,使用ndk-build和ant在Windows 7上进行编译)

编译Lua(版本5.3)非常简单,我使用了以下文章来获取内部资产目录的访问权限: 50ply博客帖子关于加载压缩的Android资产

我在已替换的fopen函数中添加了一个输出,以帮助调试此问题,当我运行:

luaL_dofile(LuaS, "scripts/test.lua");

我得到了:

>> scripts/test.lua , read

这对我来说非常完美,运行了位于资产/脚本文件夹中的文件,但当我尝试在Lua脚本中运行以下行时:

local derp = require("scripts.noop")

我得到了:

>> /usr/local/lib/lua/5.3/scripts/noop.so , read

在查看Lua源代码后,该路径似乎是在"luaconf.h"中定义的"LUA_CDIR",这也解释了为什么它在寻找*.so文件而不是*.lua文件...因此,我不确定为什么它正在寻找LUA_CPATH而不是LUA_PATH,或者如何解决该问题。

如果有人能指导我方向,那将是很棒的,如果我可以在Lua源代码外部重写搜索路径/设置来完成这个问题,那就更好了。

如果这个问题没有描述清楚,我很抱歉,如果需要更多的信息,我会提供的。我现在有点赶时间。

感谢您的阅读。

点赞
用户2262111
用户2262111

Require 检查 LUA_PATHLUA_CPATH,在 package.pathpackage.cpath 中找到许多不同的组合。环境变量 LUA_PATHLUA_CPATH 实际上可以在合并到包中找到。

伪C/C++示例:

lua_getglobal(L, "package");
lua_getfield(L, -1, "path");
lua_getfield(L, -2, "cpath");
const char* cpath = lua_tostring(L, -1);
const char* path = lua_tostring(L, -2);
lua_pop(L, 3); // field 2, field 1, package table
printf("cpath: `%s`\n", cpath);
printf("path: `%s`\n", path);

这几乎相当于,减去打印调用:

>print(package.cpath)
.\?.dll;C:\Program Files\LuaConsole\bin\?.dll;C:\Program Files\LuaConsole\bin\loadall.dll
>print(package.path)
.\?.lua;C:\Program Files\LuaConsole\bin\lua\?.lua;C:\Program Files\LuaConsole\bin\lua\?\init.lua;

以下是 require 的工作示例:

>require("abc")
 (Runtime) | Stack Top: 0 | [string "require("abc")"]:1: module 'abc' not found:

        no field package.preload['abc']
        no file '.\abc.lua'
        no file 'C:\Program Files\LuaConsole\bin\lua\abc.lua'
        no file 'C:\Program Files\LuaConsole\bin\lua\abc\init.lua'
        no file '.\abc.dll'
        no file 'C:\Program Files\LuaConsole\bin\abc.dll'
        no file 'C:\Program Files\LuaConsole\bin\loadall.dll'
 --
stack traceback:
        [C]: in function 'require'
        [string "require("abc")"]:1: in main chunk
        [C]: at 0x00401c80

你的问题的解决方案是让你的资产目录落到 package.cpathpackage.path 中找到的目录中。如 @GabeSechan 在评论中建议的那样,"如果能够将文件从资产复制到实际文件系统,你可能会更容易地处理问题。资产不是设备上的目录,因此任何寻找文件的内容都无法找到它。" 如果你能解决这个问题,就去做吧!

2018-02-22 02:10:25