FFI
介绍
FFI 库,是 LuaJIT 中最重要的一个扩展库。它允许从纯 Lua 代码调用外部C函数
,使用 C 数据结构
。
在 JIT 编译过的代码中,调用 C 函数,可以被内连处理,不同于
基于 Lua/C API 函数调用。 说明FFI库比正常的LUA/C API调用高效很多。
使用
调用C函数
local ffi = require("ffi")
ffi.cdef[[
int printf(const char *fmt, ...);
]]
ffi.C.printf("Hello %s!", "world")
- 加载 FFI 库。
- 为函数增加一个函数声明。这个包含在 中括号 对之间的部分,是标准C语法。
- 调用命名的 C 函数——非常简单。
使用标准C库的命名空间 ffi.C。通过符号名 (“printf”) 索引这个命名空间,自动绑定标准 C 库。索引结果是一个特殊类型的对象,当被调用时,执行 printf 函数。传递给这个函数的参数,从 Lua 对象自动转换为相应的 C 类型。
复杂调用
ffi接口返回的是cdata类型的数据结构或者单位,Lua不能直接打印。
lua中的local str在ffi中默认的是string,如果要传递给c的函数参数,两种方式
a. c函数中使用const char *
b.
local text = "text"
local c_str = ffi.new("char[?]", #text)
ffi.copy(c_str, text)
lib.drawText(fb, px, py, c_str, color)
加载so
local zlib = ffi.load(ffi.os == "Windows"