尝试通过 Android 上的 require 访问资产中的 Lua 脚本
Posted
技术标签:
【中文标题】尝试通过 Android 上的 require 访问资产中的 Lua 脚本【英文标题】:Trying to access Lua scripts in assets via require on Android 【发布时间】:2018-08-01 14:35:57 【问题描述】:我最近尝试将我一直在开发的引擎移植到 android 上,但在尝试在 lua 脚本中使用“require”或“dofile”时遇到了一些问题。
(快速说明:这是用 C++11 编写的,使用 ndk-build 和 ant 在 windows 7 上编译)
编译 Lua(5.3 版)非常简单,我使用以下文章来访问内部资产目录: 50ply blog post on loading compressed android assets
我在替换的 fopen 函数中添加了一个输出来帮助调试这个问题,当我运行时:
luaL_dofile(LuaS, "scripts/test.lua");
我明白了:
>> scripts/test.lua , read
这对我来说是完美的并在 assets/scripts 文件夹中运行文件,但是当我尝试在 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 源之外的搜索路径/设置来做到这一点,那就更好了。
对不起,如果这个问题写得不好,如果需要任何进一步的信息,我会提供。我现在有点着急。
感谢阅读。
【问题讨论】:
如果您将文件从资产复制到实际的文件系统,您可能会更轻松。 Assets 不是设备上的目录,因此任何寻找文件的东西都找不到。 【参考方案1】:需要检查LUA_PATH
和LUA_CPATH
,并在package.path
和package.cpath
中找到许多不同的组合。环境变量LUA_PATH
和 LUA_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("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
内的目录中。正如@GabeSechan 在 cmets 中所建议的那样,“如果您将文件从资产复制到实际的文件系统,您可能会更轻松。资产不是设备上的目录,因此找不到文件的任何内容它。”所以,如果你能找到这个位置,那就去吧!
【讨论】:
您的建议导致调试路径,结果证明使用 Lua 行 package.path = "?.lua" 可以访问资产目录。所以我接受你的帖子是我写得很糟糕的问题的答案。以上是关于尝试通过 Android 上的 require 访问资产中的 Lua 脚本的主要内容,如果未能解决你的问题,请参考以下文章
错误尝试通过 callign firebase.app() 使用未安装在您的 Android 项目上的 firebase 模块