首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在LuaSocket应用程序中使用iOS?

如何在LuaSocket应用程序中使用iOS?
EN

Stack Overflow用户
提问于 2015-02-07 13:19:52
回答 2查看 997关注 0票数 1

我正在开发一个可以运行iOS脚本的Lua应用程序,我可以轻松地将基本的lua支持与CocoaPods集成起来,但是我如何将LuaSocket库添加到其中呢?LuaSocket包含一些CLua文件,有人有想法吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-17 05:25:14

在iOS 8允许动态框架(库)的情况下,可能有一种更优雅的方法,但下面的方法适用于Lua5.2.3(因为您正在使用Cocoapods,而5.2.3是Cocoapod提供的版本)和LuaSocket 3.0-rc1

请注意,我实际上没有使用Cocoapod;在您的iOS项目中包括Lua非常简单,因此我发现使用Cocoapods并不值得。YMMV由于路径的不同,您可能需要对我在下面描述的内容做一些调整。

  1. 创建一个新的iOS‘单视图’项目
  2. 在XCode的项目导航器中创建名为Lua的组
  3. 将Lua下载中的lua.hpp目录中的所有文件( lua.c、luac.c、lua.hpp和makefile除外)复制到这个组中
  4. 在XCode的项目导航器中创建一个名为LuaSocket的组
  5. 将所有文件( makefile、wsocket.c、wsocket.h除外)从src下载的LuaSockets目录复制到这个组中
  6. 将行#import "luasocket.h"添加到LuaSocket源代码中的文件serial.h

此时,您应该能够构建和运行应用程序,没有任何错误。当然,它还没什么用.

首先,我们将修改luaL_openlibs,使其初始化LuaSocket的C代码,如下所示。

在Lua源代码中,找到linit.c文件并更改

代码语言:javascript
复制
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}
};

代码语言:javascript
复制
  {"_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}
};

您需要在linit.c的顶部添加#include "luasocket.h"#include "mime.h"

还有一些其他的C函数需要添加到这个列表中,比如luaopen_socket_unix,但是我将把它们作为一个练习留给读者。

现在,我们将转到LuaSocket中包含的各种Lua源文件,例如socket.lua和mime.lua。与其使用require加载这些数据,不如使用luaL_dofile来执行它们。

为了具体起见,假设我们希望使用LuaSocket对视图控制器进行一些初始化。我们将在viewDidLoad中创建Lua状态,调用luaL_openlibs,以初始化核心库和LuaSocket的C库,然后我们将使用来自NSBundle的例程获得要运行的Lua文件的文件路径。

我们需要编辑Lua文件以删除任何require socket.core、mime.core等行,因为这比试图让require正确运行更简单。此外,socket.core和mime.core已经被我们修改的luaL_openlibs初始化了,因此不需要对它们进行require

所以viewDidLoad看起来会是这样的:

代码语言:javascript
复制
- (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]);
}

还有一些不确定的地方,但这应该能说明要点。您可以查看我在Github上创建的示例项目。在接下来的几天里,我将清理它并演示更多LuaSocket的功能。

票数 4
EN

Stack Overflow用户

发布于 2015-02-13 11:44:41

我使用了2.0.2版本的LuaSocket和5.1版本的Lua。修改一些文件后,未知类型名称'luaL_reg';您的意思是'luaL_Reg‘吗?我能编译。还删除了wsocket (.h & .c)文件。所以它是在编译。经过一些搜索,我还发现Cocos2d-x源代码(3.0.4)使用luasocket文件夹(并有libla.a)。再次删除wsocket文件,然后编译,没有错误。我用过

代码语言:javascript
复制
    -(void)addBundlePathToLuaState:(lua_State*)L
   {
    lua_getglobal(L, "package");
   lua_getfield(L, -1, "path"); // get field "path" from table at top of stack (-1)

   const char* current_path_const = lua_tostring(L, -1); // grab path string from top of stack
   NSString* current_path = [NSString stringWithFormat:@"%s;%@/?.lua", current_path_const, [[NSBundle mainBundle]resourcePath]];

   lua_pop(L, 1); // get rid of the string on the stack we just pushed on line 5
   lua_pushstring(L, [current_path UTF8String]); // push the new one
   NSLog(@"path current %s", [current_path UTF8String]);
   lua_setfield(L, -2, "path"); // set the field "path" in table at -2 with value at top of stack
   lua_pop(L, 1); // get rid of package table from top of stack
     }

代码语言:javascript
复制
   int status;
   lua_State *La;
   La = luaL_newstate();
   NSBundle* myBundle = [NSBundle mainBundle];
   NSString* myImage = [myBundle pathForResource:@"a" ofType:@"lua"];
   const char *stringAsChar = [myImage cStringUsingEncoding:[NSString defaultCStringEncoding]];
   NSLog(@"mypath %s", stringAsChar);
   luaL_openlibs(La); /* Load Lua libraries */
/* Load the file containing the script we are going to run */
   status = luaL_loadfile(La, stringAsChar);
   NSString *luaFilePath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"lua"];
   [self addBundlePathToLuaState:La];

我的脚本使用本地socket = require("socket"),但问题是它找不到核心socket.lua:13:模块'socket.core‘找不到:没有字段包。预加载’socket.core‘

所以我认为你不可能很快获得成功:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28382583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档