试图通过Android上的require访问资产中的Lua脚本

试图通过Android上的require访问资产中的Lua脚本,android,ant,lua,android-ndk,sdl-2,Android,Ant,Lua,Android Ndk,Sdl 2,我最近尝试将我一直在开发的一个引擎移植到Android上,在尝试在lua脚本中使用“require”或“dofile”时遇到了一些问题 (简要说明:这是用C++11编写的,使用ndk构建和ant在windows 7上编译) 编译Lua(5.3版)非常简单,我使用以下文章访问内部资产目录: 我在替换的fopen函数中添加了一个输出,以帮助调试此问题,并在运行时: luaL_dofile(LuaS, "scripts/test.lua"); 我得到: >> scripts/test.

我最近尝试将我一直在开发的一个引擎移植到Android上,在尝试在lua脚本中使用“require”或“dofile”时遇到了一些问题

(简要说明:这是用C++11编写的,使用ndk构建和ant在windows 7上编译)

编译Lua(5.3版)非常简单,我使用以下文章访问内部资产目录:

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

luaL_dofile(LuaS, "scripts/test.lua");
我得到:

>> scripts/test.lua , read
>> /usr/local/lib/lua/5.3/scripts/noop.so , read
这对我来说非常适合,并在assets/scripts文件夹中运行该文件,但当我尝试在lua脚本中运行以下行时:

local derp = require("scripts.noop")
我得到:

>> scripts/test.lua , read
>> /usr/local/lib/lua/5.3/scripts/noop.so , read
在浏览了Lua源代码之后,这个路径似乎是“luaconf.h”中定义的“Lua_CDIR”,这也解释了为什么它查找*.so文件而不是*.Lua。。。所以我不确定它为什么要寻找LUA_CPATH而不是LUA_路径,或者如何解决这个问题

如果有人能给我指出正确的方向,那就太好了,如果我能通过覆盖Lua源之外的搜索路径/设置来实现这一点,那就更好了

对不起,如果这个问题写得不好,如果需要进一步的信息,我会提供。我现在有点忙


感谢阅读。

要求同时检查
LUA\u路径
LUA\u CPATH
,并在
package.PATH
package.CPATH
中找到许多不同的组合。环境变量
LUA_PATH
和LUA_CPATH实际上可以被合并到包中

Psuedo-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("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.cpath
package.path
中的目录中。正如@Gabeschen在评论中所建议的,“如果您将文件从资产复制到实际的文件系统中,您可能会有一个更轻松的工作时间。资产不是设备上的目录,因此任何查找文件的东西都找不到它。”因此,如果您能够找到它,就去做吧

如果您将文件从资产复制到实际的文件系统,您可能会有一段轻松的时间。资产不是设备上的目录,因此任何查找文件的操作都找不到它。您的建议会导致调试路径,结果是使用Lua行package.path=“?.Lua”可以访问资产目录。所以我接受你的帖子是对我糟糕的书面问题的回答。