Lua
스크립트 를 실행할 수있는 iOS 앱을 개발 중입니다. 기본 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 다운로드 디렉토리의 모든 파일 (lua.c, luac.c, lua.hpp 및 makefile 제외)을이 그룹으로 복사합니다.src
LuaSockets 다운로드 디렉토리의 모든 파일 (makefile, wsocket.c, wsocket.h 제외)을이 그룹에 복사합니다.#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}
};
linit.c의 맨 위에 #include "luasocket.h"
및 추가해야합니다 #include "mime.h"
.
이 목록에 추가하고 싶은 몇 가지 다른 C 함수 (예 :) luaopen_socket_unix
가 있지만 독자를위한 연습용으로 포함하도록하겠습니다.
이제 socket.lua 및 mime.lua와 같이 LuaSocket에 포함 된 다양한 Lua 소스 파일을 살펴 보겠습니다. 를 사용 require
하여로드하는 대신을 사용하여 실행할 것입니다 luaL_dofile
.
구체적으로보기 위해 LuaSocket을 사용하여 뷰 컨트롤러에 대한 초기화를 수행한다고 가정합니다. 코어 라이브러리와 LuaSocket의 C 라이브러리를 초기화하기 위해 viewDidLoad
, 에서 Lua 상태를 생성 luaL_openlibs
하고 .NET의 루틴을 사용하여 실행하려는 Lua 파일의 파일 경로를 가져옵니다 NSBundle
.
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]);
}
여전히 몇 가지 느슨한 끝이 있지만 이것이 주요 요점을 보여줄 것입니다. 내가 Github에서 만든 예제 프로젝트를 볼 수 있습니다 . 앞으로 며칠 동안 정리하고 LuaSocket의 기능을 더 많이 시연 할 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다