結(jié)構(gòu)定義
首先需要使用ffi.cdef定義需要的結(jié)構(gòu)體,如下:
ffi.cdef[[
#pragma pack(1)
typedef struct point{
int x;
int y;
char text[128];
}point_t;
#pragma pack()
]];
Lua中創(chuàng)建結(jié)構(gòu)對象
使用ffi.new創(chuàng)建新的結(jié)構(gòu)對象
cdata = ffi.new(ct, [init])
如初始化一個point_t對象
local p1 = ffi.new('point_t', {x=10, y=20, text='first point'});
訪問結(jié)構(gòu)成員
直接使用.操作符即可晋修。如p1.x,p1.y等恒界。
如果是字符串的話喂柒,需要使用字符串轉(zhuǎn)換函數(shù)
ffi.string(ptr, [ len])
帶長度是內(nèi)存拷貝踩蔚,不帶長度是自動以\0結(jié)束。
轉(zhuǎn)換成內(nèi)存塊
- 先轉(zhuǎn)換成void指針 pdata = ffi.cast('void', p1)
- 在轉(zhuǎn)換成lua string枚粘, ffi.string(pdata, ffi.sizeof(p1))
從內(nèi)存塊轉(zhuǎn)換成
local p = ffi.cast('point_t *', st)
轉(zhuǎn)換的結(jié)果是一個指針對象
數(shù)組處理
原型
local p = ffi.new('ct[?]', length, [init..])
分配字符串數(shù)組
local p = ffi.new('char[?]', 1000)
數(shù)組的訪問下標需要從0開始