結(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)對(duì)象
使用ffi.new創(chuàng)建新的結(jié)構(gòu)對(duì)象
cdata = ffi.new(ct, [init])
如初始化一個(gè)point_t對(duì)象
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])
帶長(zhǎng)度是內(nèi)存拷貝,不帶長(zhǎng)度是自動(dòng)以\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é)果是一個(gè)指針對(duì)象
數(shù)組處理
原型
local p = ffi.new('ct[?]', length, [init..])
分配字符串?dāng)?shù)組
local p = ffi.new('char[?]', 1000)
數(shù)組的訪問下標(biāo)需要從0開始