您的位置:首页 > 编程语言 > Lua

lua ffi简介

2016-03-03 11:41 781 查看

本文转自网络

由来

FFI库,是LuaJIT中最重要的一个扩展库。它允许从纯Lua代码调用外部C函数,使用C数据结构。有了它,就不用再像

Lua
标准math库一样,编写Lua扩展库。把开发者从开发Lua扩展C库(语言/功能绑定库)的繁重工作中释放出来。

FFI简介

FFI库,允许从纯Lua代码调用外部C函数,使用C数据结构。

FFI库最大限度的省去了使用C手工编写繁重的Lua/C绑定的需要。不需要学习一门独立/额外的绑定语言——它

解析普通C声明
。这样可以从C头文件或参考手册中,直接
剪切,粘贴
。它的任务就是
绑定很大的库,但不需要捣鼓脆弱的绑定生成器

FFI紧紧的整合进了LuaJIT(几乎不可能作为一个独立的模块)。JIT编译器为Lua代码直接访问C数据结构而产生的代码,等同于一个C编译器应该生产的代码。在JIT编译过的代码中,调用C函数,可以被

内连
处理,不同于基于Lua/CAPI函数调用。

这一页将简要介绍FFI库的使用方法。

 

安装LuaJIT

mkdir-p~/lua-ffi_in_action&&cd~/lua-ffi_in_action
gitclonehttp://luajit.org/git/luajit-2.0.git
cdluajit-2.0
make&&makeinstall
[/code]

激励范例:调用外部C函数

真的很用容易去调用一个外部C库函数:

操作步骤如下:

①加载FFI库
②为函数增加一个函数声明。这个包含在`中括号`对之间的部分,是标准C语法。.
③调用命名的C函数——非常简单
wss@localhost:~/lua/train/ffi$
vimtest.lua
localffi=require("ffi")
ffi.cdef[[
typedefstruct{uint8_tred,green,blue;}rgb;]]
ffi.cdef[[
intprintf(constchar*fmt,...);]]
localimg=ffi.new("rgb")
img.red=99
print(img.red)
ffi.C.printf("Hello%s!","world\n")

执行
wss@localhost:~/lua/train/ffi$luajittest.lua
99
Helloworld
[/code]

事实上,背后的实现远非如此简单:③使用标准C库的命名空间

ffi.C
。通过符号名("printf")索引这个命名空间,自动绑定标准C库。索引结果是一个特殊类型的对象,当被调用时,执行
printf
函数。传递给这个函数的参数,从Lua对象自动转换为相应的C类型。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: