菜鸟教程小白 发表于 2022-12-12 20:36:59

ios - lua require 函数在 iOS 上找不到我需要的文件


                                            <p><p>我是 lua 新手,这可能很简单,但我想不通。我做了整夜搜索,在这里阅读了一些帖子,但并不是我想要的。我终于想出了一个我不满意的蹩脚解决方案,所以我在这里寻求帮助。</p>

<p>我正在尝试将 lua 嵌入到 c++ 中,并且该程序将作为 iPhone 上应用程序的一部分运行,正如我们所知,每个 iPhone 应用程序都有一个资源包,并且 lua 脚本与包一起分发。</p>

<pre><code>// I printed out the bundle path:
bundle directory /var/mobile/Applications/C6CEF090-B99A-4B9B-ADAC-F0BEF46B6EA4/LuaThirdTry.app
</code></pre>

<p>假设我在同一个文件夹中有两个脚本文件(main.lua,mylib.lua),我将它们放在我的 Xcode 项目中,组织如下:</p>

<pre><code>somefolder
|--main.lua
|--mylib.lua
</code></pre>

<p>main.lua 如下:</p>

<pre><code>--main.lua
print(package.path)
require(&#34;mylib&#34;)
</code></pre>

<p>显然我想使用来自 mylib.lua 的代码,但是,我从 lua vm 得到错误:</p>

<pre><code>/usr/local/share/lua/5.2/?.lua;/usr/local/share/lua/5.2/?/init.lua;/usr/local/lib/lua/5.2/?.lua;/usr/local/lib/lua/5.2/?/init.lua;./?.lua
PANIC: unprotected error in call to Lua API (...090-B99A-4B9B-ADAC-F0BEF46B6EA4/LuaThirdTry.app/test.lua:5: module &#39;mylib&#39; not found:
    no field package.preload[&#39;mylib&#39;]
    no file &#39;/usr/local/share/lua/5.2/mylib.lua&#39;
    no file &#39;/usr/local/share/lua/5.2/mylib/init.lua&#39;
    no file &#39;/usr/local/lib/lua/5.2/mylib.lua&#39;
    no file &#39;/usr/local/lib/lua/5.2/mylib/init.lua&#39;
    no file &#39;./mylib.lua&#39;
    no file &#39;/usr/local/lib/lua/5.2/mylib.so&#39;
    no file &#39;/usr/local/lib/lua/5.2/loadall.so&#39;
    no file &#39;./mylib.so&#39;)
</code></pre>

<p>当我添加一行修改 package.path 时,它运行正常:</p>

<pre><code>--main.lua modified
print(package.path)
package.path = package.path .. &#34;;/var/mobile/Applications/C6CEF090-B99A-4B9B-ADAC-F0BEF46B6EA4/LuaThirdTry.app/?.lua&#34;
require(&#34;mylib&#34;)
</code></pre>

<p>但这是绝对路径,绝对应该避免。
解决此问题的一种方法是从 c 中提供 lua 一个函数,该函数在运行时将 ipa 包中 lua 文件的完整路径返回到 lua 脚本,并将 package.path 与该路径连接起来,但我认为不应该这样做的“官方”方式。</p>

<p>我注意到package.path变量里面有“./?.lua”,我只是想知道为什么找不到mylib.lua,不是同一目录下的文件吗?</p>

<p>抱歉,问题是:如何在 iOS 环境中体面地执行“要求”?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>好的,我终于找到了一个好的答案,工作完成了,感谢<a href="https://stackoverflow.com/a/4156038/1317816" rel="noreferrer noopener nofollow">this answer</a> .</p>

<p>所以,解决办法是在c++代码中修改路径,添加这个函数</p>

<pre><code>#include &lt;string&gt;

int setLuaPath(lua_State* L, const char* path) {
    lua_getglobal(L, &#34;package&#34;);
    lua_getfield(L, -1, &#34;path&#34;); // get field &#34;path&#34; from table at top of stack (-1)
    std::string cur_path = lua_tostring(L, -1); // grab path string from top of stack
    cur_path.append(&#34;;&#34;); // do your path magic here
    cur_path.append(path);
    lua_pop(L, 1); // get rid of the string on the stack we just pushed on line 5
    lua_pushstring(L, cur_path.c_str()); // push the new one
    lua_setfield(L, -2, &#34;path&#34;); // set the field &#34;path&#34; in table at -2 with value at top of stack
    lua_pop(L, 1); // get rid of package table from top of stack
    return 0; // all done!
}
</code></pre>

<p>然后,在初始化lua_State的时候调用这个函数:</p>

<pre><code>// yourfile.cpp
void runLua() {
    lua_State *L;
    L = luaL_newstate();
    luaL_openlibs(L);

    OCCaller oc_caller;
    std::string bundlePath = oc_caller.get_ios_bundle_path();
    bundlePath.append(&#34;/?.lua&#34;);
    setLuaPath(L, bundlePath.c_str());

    ....
}
</code></pre>

<p>您的 oc_caller 类可能如下所示:</p>

<pre><code>// OCCaller.h
#ifndef __LuaThirdTry__OCCaller__
#define __LuaThirdTry__OCCaller__

#include &lt;iostream&gt;

class OCCaller {
public:
    OCCaller();
    ~OCCaller();
    std::string get_ios_bundle_path();

};

#endif
</code></pre>

<p>实现文件:</p>

<pre><code>// OCCaller.mm
#include &#34;OCCaller.h&#34;
#import &lt;Foundation/Foundation.h&gt;

OCCaller::OCCaller() { }
OCCaller::~OCCaller() { }

std::string OCCaller::get_ios_bundle_path() {
    NSString *bundlePath = [resourcePath];
    return std::string();
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - lua require 函数在 iOS 上找不到我需要的文件,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/22492741/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/22492741/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - lua require 函数在 iOS 上找不到我需要的文件