1

スクリプトを実行できる iOS アプリを開発しています。基本サポートを とLua簡単に統合できますが、ライブラリを追加するにはどうすればよいですか? いくつかのファイルが含まれていますが、アイデアはありますか?ありがとう!luaCocoaPodsLuaSocketLuaSocketCLua

4

2 に答える 2

4

動的フレームワーク (ライブラリ) を許可する iOS 8 では、より洗練されたアプローチがあるかもしれませんが、以下は Lua 5.2.3 ( Cocoapod を使用しており、5.2.3 は Cocoapod が提供するバージョンであるため) およびLuaSocket 3.0-rc1で動作します。

私は実際には Cocoapod を使用していないことに注意してください。iOS プロジェクトに Lua を含めるのは簡単なので、Cocoapods をわざわざ使う価値はないと思います。YMMV。パスの違いにより、以下で説明する内容をいくつか調整する必要がある場合があります。

  1. 新しい iOS 'Single View' プロジェクトを作成します
  2. XCode のプロジェクト ナビゲーターで Lua という名前のグループを作成します。
  3. srcLua ダウンロードのディレクトリからすべてのファイル (lua.c、luac.c、lua.hpp、makefile を除く)をこのグループにコピーします。
  4. XCode のプロジェクト ナビゲーターで LuaSocket という名前のグループを作成します。
  5. LuaSockets ダウンロードのディレクトリからすべてのファイル (makefile、wsocket.c、wsocket.h を除く)srcをこのグループにコピーします。
  6. #import "luasocket.h"LuaSocket ソースのファイル serial.h に次の行を追加します。

この時点で、エラーなしでアプリをビルドして実行できるはずです。もちろん、まだ実際には何もしていません...

まず、luaL_openlibsLuaSocket の 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}
};

また、linit.c の先頭に#include "luasocket.h"andを追加する必要があります。#include "mime.h"

など、このリストに追加したい C 関数が他にもいくつかありますがluaopen_socket_unix、読者の演習としてそれらを含めておきます。

ここで、socket.lua や mime.lua など、LuaSocket に含まれるさまざまな Lua ソース ファイルに目を向けます。requireを使用してこれらをロードするのではなく、で実行しますluaL_dofile

具体的に言うと、LuaSocket を使用してビュー コントローラーの初期化を行いたいとします。コア ライブラリと LuaSocket の C ライブラリを初期化するためにviewDidLoad、 callでLua 状態を作成します。次に、 からルーチンを使用して実行する Lua ファイルへのファイルパスを取得します。luaL_openlibsNSBundle

requireLua ファイルを編集して、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]);
}

まだ未解決の点がいくつかありますが、これで要点が示されるはずです。私が作成したサンプル プロジェクトを Githubで見ることができます。今後数日かけてクリーンアップし、LuaSocket の機能をさらに詳しく説明します。

于 2015-02-17T05:25:14.650 に答える