我正在开发一个可以运行的iOS应用Lua
脚本,我可以轻松集成基础 lua
支持 CocoaPods
, 但是我怎样才能添加 LuaSocket
图书馆进吗? LuaSocket
包含一些 C
还有一些 Lua
文件,有人有想法吗?谢谢!
最佳答案
iOS 8 允许动态框架(库)可能有更优雅的方法,但以下适用于 Lua 5.2.3(因为您使用的是 Cocoapods,而 5.2.3 是 Cocoapod 提供的版本)和 LuaSocket 3.0-rc1 .
请注意,我实际上并没有使用 Cocoapod;在你的 iOS 项目中包含 Lua 非常简单,我发现使用 Cocoapods 不值得。 YMMV。由于路径差异,您可能需要对我在下面描述的内容进行一些调整。
src
复制所有文件(除了 lua.c、luac.c、lua.hpp 和 makefile) Lua目录下下载到本组src
复制所有文件(除了 makefile、wsocket.c、wsocket.h) LuaSockets目录下下载到本组#import "luasocket.h"
到 LuaSocket 源中的文件 serial.h 此时,您应该能够构建和运行应用程序而不会出现任何错误。当然,它还没有真正做任何事情......
首先,我们要修改
luaL_openlibs
使其初始化 LuaSocket 的 C 代码如下。在 Lua 源中,找到文件 linit.c 并更改
static const luaL_Reg loadedlibs[] = {
{"_G", luaopen_base},
{LUA_LOADLIBNAME, luaopen_package},
{LUA_COLIBNAME, luaopen_coroutine},
{LUA_TABLIBNAME, luaopen_table},
{LUA_IOLIBNAME, luaopen_io},
{LUA_OSLIBNAME, luaopen_os},
{LUA_STRLIBNAME, luaopen_string},
{LUA_BITLIBNAME, luaopen_bit32},
{LUA_MATHLIBNAME, luaopen_math},
{LUA_DBLIBNAME, luaopen_debug},
{NULL, NULL}
};
到
{"_G", luaopen_base},
{LUA_LOADLIBNAME, luaopen_package},
{LUA_COLIBNAME, luaopen_coroutine},
{LUA_TABLIBNAME, luaopen_table},
{LUA_IOLIBNAME, luaopen_io},
{LUA_OSLIBNAME, luaopen_os},
{LUA_STRLIBNAME, luaopen_string},
{LUA_BITLIBNAME, luaopen_bit32},
{LUA_MATHLIBNAME, luaopen_math},
{LUA_DBLIBNAME, luaopen_debug},
{"socket", luaopen_socket_core},
{"mime", luaopen_mime_core},
{NULL, NULL}
};
您需要添加
#include "luasocket.h"
和 #include "mime.h"
在 linit.c 的顶部。您还需要将一些其他 C 函数添加到此列表中,例如
luaopen_socket_unix
,但我会将它们作为练习留给读者。现在我们将转向 LuaSocket 中包含的各种 Lua 源文件,例如 socket.lua 和 mime.lua。而不是使用
require
要加载这些,我们将使用 luaL_dofile
执行它们.为了具体一点,假设我们想使用 LuaSocket 为我们的 View Controller 做一些初始化。我们将在
viewDidLoad
中创建 Lua 状态, 调用luaL_openlibs
, 初始化核心库和 LuaSocket 的 C 库,然后我们将使用 NSBundle
中的例程获得要运行的 Lua 文件的文件路径.我们需要编辑 Lua 文件以删除
require
的所有行。 socket.core、mime.core 等,因为这比尝试获取 require
更简单行为正确。此外,socket.core 和 mime.core 已经被我们修改过的 luaL_openlibs
初始化了。 ,所以不需要require
他们。所以
viewDidLoad
看起来像这样:- (void)viewDidLoad
{
[super viewDidLoad];
lua_State *L = luaL_newstate();
luaL_openlibs(L);
// Load socket.lua and mime.lua
NSString *fp = [[NSBundle mainBundle] pathForResource:@"socket" ofType:@"lua"];
luaL_dofile(L, [fp cStringUsingEncoding:NSUTF8StringEncoding]);
fp = [[NSBundle mainBundle] pathForResource:@"mime" ofType:@"lua"];
luaL_dofile(L, [fp cStringUsingEncoding:NSUTF8StringEncoding]);
lua_settop(L, 0); // ignore return values from the calls to dofile
// Now do something with the Lua state and LuaSockets
NSString *script = @"res = mime.b64('LuaSocket', 'works')";
luaL_dostring(L, [script cStringUsingEncoding:NSUTF8StringEncoding]);
lua_getglobal(L, "res");
const char *s = luaL_checkstring(L, 1);
NSLog(@"res = %@", [NSString stringWithCString:s encoding:NSUTF8StringEncoding]);
}
还有一些松散的结局,但这应该说明要点。您可以查看 example project我在 Github 上创建的。在接下来的几天里,我会清理它并展示更多 LuaSocket 的功能。
关于ios - 如何在 iOS 应用中使用 LuaSocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28382583/