外部函数接口(FFI)是一种机制,使一种编程语言编写的程序可以调用另一种语言实现或编译出的函数/服务。FFI 常用于调用二进制动态链接库中的能力。
lua-ffi 是一个面向 Lua 的可移植、轻量级 C FFI,基于 libffi 实现,目标是尽量兼容 LuaJIT FFI,并且由 C 语言从零实现。
- 可移植:可用于 Lua5.1、Lua5.2、Lua5.3 和 Lua5.4。
- 轻量:使用 C 语言实现,体积很小,仅约 50KB。
local ffi = require 'ffi'
ffi.cdef([[
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
struct timezone {
int tz_minuteswest; /* minutes west of Greenwich */
int tz_dsttime; /* type of DST correction */
};
int gettimeofday(struct timeval *tv, struct timezone *tz);
char *strerror(int errnum);
]])
local function strerror(errno)
return ffi.string(ffi.C.strerror(errno))
end
local tv = ffi.new('struct timeval')
if ffi.C.gettimeofday(tv, nil) < 0 then
print('gettimeofday fail:', strerror(ffi.errno()))
else
print('tv.tv_sec:', tv.tv_sec, 'tv.tv_usec:', tv.tv_usec)
end- libffi - 一个可移植的外部函数接口库。
- Lua 5.1 或更新版本(已测试到 5.4)。
sudo apt install -y liblua5.3-dev libffi-dev
git clone https://github.com/zhaojh329/lua-ffi.git
cd lua-ffi && mkdir build && cd build
cmake .. && sudo make install
Languages --->
Lua --->
<> lua-ffi............ A portable lightweight C FFI for lua5.1, based on libffi
<> lua-ffi-lua5.3..... A portable lightweight C FFI for lua5.3, based on libffi
<*> lua-ffi-lua5.4..... A portable lightweight C FFI for lua5.4, based on libffi
本项目受以下仓库启发:
感谢这些项目作者的优秀工作。