尝试通过Android访问资产中的Lua脚本
2018-2-21 21:17:43
收藏:0
阅读:81
评论:1
我最近尝试将我正在开发的一个引擎移植到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源代码外部重写搜索路径/设置来完成这个问题,那就更好了。
如果这个问题没有描述清楚,我很抱歉,如果需要更多的信息,我会提供的。我现在有点赶时间。
感谢您的阅读。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

Require检查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的工作示例:>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 在评论中建议的那样,"如果能够将文件从资产复制到实际文件系统,你可能会更容易地处理问题。资产不是设备上的目录,因此任何寻找文件的内容都无法找到它。" 如果你能解决这个问题,就去做吧!