结构定义
首先需要使用ffi.cdef定义需要的结构体,如下:
ffi.cdef[[
#pragma pack(1)
typedef struct point{
int x;
int y;
char text[128];
}point_t;
#pragma pack()
]];
Lua中创建结构对象
使用ffi.new创建新的结构对象
cdata = ffi.new(ct, [init])
如初始化一个point_t对象
local p1 = ffi.new('point_t', {x=10, y=20, text='first point'});
访问结构成员
直接使用.操作符即可。如p1.x,p1.y等。
如果是字符串的话,需要使用字符串转换函数
ffi.string(ptr, [ len])
带长度是内存拷贝,不带长度是自动以\0结束。
转换成内存块
- 先转换成void指针 pdata = ffi.cast('void', p1)
- 在转换成lua string, ffi.string(pdata, ffi.sizeof(p1))
从内存块转换成
local p = ffi.cast('point_t *', st)
转换的结果是一个指针对象
数组处理
原型
local p = ffi.new('ct[?]', length, [init..])
分配字符串数组
local p = ffi.new('char[?]', 1000)
数组的访问下标需要从0开始