一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
最近项目中提到需要调用Lua,所以简单的研究了一下,也看了不少网上大佬的文章,在这就简单的写一下收获吧。
下载和编译Lua解析器
首先,跳转到Lua官网的下载页将源码下载下来。然后解压下载包可以得到如下图所示的目录结构:
Lua源码目录结构
对应的目录说明如下表:
| 名称 | 说明 |
|---|---|
| doc | Lua相关的文档,包括了编译文档、接口文档等 |
| Makefile | 编译Lua使用,在这里我们不使用它来进行编译 |
| README | 关于Lua的说明文件 |
| src | Lua的源码文件 |
编译Lua源码
在这里我们只需要src目录中的源码文件,先打开src目录,将Makefile、lua.c、luac.c三个文件删除掉,需要说明的是lua.c和luac.c文件是用于编译生成lua和luac两个命令不属于解析器的功能,如果不删除可能会导致XCode无法编译通过。
接下来打开XCode创建一个新的项目并把src目录拖入项目中。如下图所示:
导入Lua源码到项目
然后Command+B进行编译,提示编译成功!
接下来就是实际操作:
From OC to Lua
1 空值传递
使用lua_pushnil方法可以将任意一个Lua变量置空。如:
lua_pushnil();
lua_setglobal(self.state, "val");
2 数值的传递
使用lua_pushinteger或者lua_pushnumber方法来将OC中的数值类型传递到Lua中指定的某个变量。如:
//传递整型值
lua_pushinteger(self.state, 1024);
lua_setglobal(self.state, "intVal");
//传递浮点型
lua_pushnumber(self.state, 80.08);
lua_setglobal(self.state, "numVal");
3 布尔值的传递
使用lua_pushboolean方法来实现,如:
lua_pushboolean(self.state, YES);
lua_setglobal(self.state, "boolVal");
4 字符串的传递
使用lua_pushstring方法可以传递字符串给Lua,要注意的是该方法接收的是一个c描述的字符串(即 char*)。如:
lua_pushstring(self.state, @"Hello World".UTF8String);
lua_setglobal(self.state, "stringVal");
5 二进制数组的传递
二进制数组在Lua中其实与字符串的存储方式相同,但是OC中不能直接使用lua_pushstring来进行二进制数组的传递,可以使用lua_pushlstring方法来传递。如:
char bytes[13] = {0xf1, 0xaa, 0x12, 0x56, 0x00, 0xb2, 0x43, '\0', '\0', 0x00, 0x90, 0x65, 0x73};
lua_pushlstring(self.state, bytes, 13);
lua_setglobal(self.state, "bytesVal");