Lua 扩展库

朋友们是不是感觉触动精灵提供的插件调用起来不方便,触动内置的功能十分有限?你需要什么?

文件系统操作(新建、删除、建立符号链接)……

文件格式解析(zip, rar, plist, deb)……

网络操作(http, https, ftp, sftp, ftps, udp, smtp, imap)……

图像处理(png, bmp, jpg, tiff)……

问题:有没有更加好用的 Lua 原生扩展方式呢?

答案:有!而且 Lua 扩展有很多!

Lua 的扩展(add-on)基本上来自于这两个网站:

http://luaforge.net/projects

https://rocks.moonscript.org

熟悉跨平台编译的开发者当然可以试试自己编译这当中的插件给 iOS 使用。

如果有 C 语言、Objective-C、C++ 开发能力的,当然也可以自己编写 Lua 原生扩展,还能使用 iOS 的 SDK。

用 Objective-C 给 Lua 编写扩展并在 iOS 平台上运行

关于如何编写 Lua 扩展,参见 Lua 官方文档,这里并不作介绍,以下实例及说明由 i82 提供。

mt.m:

#include <stdio.h>
#include <stdlib.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

#import <objc/runtime.h>
#import <Foundation/Foundation.h>
#import <UIKit/UIDevice.h>

/*  库 open 函数的前置声明   */
int luaopen_mt(lua_State *L);

/* Function mt_get_device_name
 * @return string device name
 */
static int mt_get_device_name(lua_State *L)
{
    NSString *name = [[UIDevice currentDevice] name];
    const char * name_str = [name UTF8String];
    lua_pushstring(L, name_str);
    return 1;
}

//注册函数库
static const luaL_Reg mt_lib[] = {
    {"device_name", mt_get_device_name},    //获取设备名称
    {NULL, NULL}
};

int luaopen_mt(lua_State *L)
{
    luaL_newlib(L, mt_lib);
    return 1;
}

单个源文件的编译与连接命令(将 gcc 换成 g++ 可使用 Objective-C++ 语法):

xcrun -sdk iphoneos gcc -arch armv7 -arch armv7s -arch arm64 -miphoneos-version-min=4.3 -O3 -std=c99 -I/opt/theos/include/ -c -o mt.o mt.m
xcrun -sdk iphoneos gcc -arch armv7 -arch armv7s -arch arm64 -miphoneos-version-min=4.3 -O3 -framework Foundation -framework UIKit -bundle -undefined dynamic_lookup -o mt.so mt.o

得到的 mt.so 即可在 Lua 中引用了:

local mt = require "mt"
print(mt.device_name())
Copyright 北京帮你玩科技有限公司 2023 all right reserved,powered by Gitbook该文章修订时间: 2024-03-06 17:50:18

results matching ""

    No results matching ""