luajit ffi 小结

本文详细介绍了 LuaJIT 的 Foreign Function Interface (FFI) 库,包括如何引入 FFI 库,如何在 Lua 中调用 C 函数,以及如何处理 C 数据对象。通过 FFI,开发者可以方便地调用 C 标准库和自定义 C 函数,同时展示了如何创建和操作 cdata 对象,如基本类型、指针和结构类型。
摘要由CSDN通过智能技术生成

luajit ffi 小结


Lua 是一种语法简单,上手快的语言,虽然原生库比较少,但是可以方便的和 C 语言互相调用,常被用于脚本嵌入到 C 程序中。如 Redis 中可以加载 Lua 脚本,作用类似于存储过程,Nginx 中 lua-nginx-module 模块更是将 Lua 的这种特性发挥到极致。

使用 Lua 如何调用 C 的函数,个人认为是每一个 Lua 开发者必学的内容。Lua 调用 C 程序有两种方法,一种是使用 lua C API,另一种方法就是使用 luajit 提供的 ffi 库来调用 C 程序。本文主要是对 luajit ffi 的研究总结。

luajit ffi

luajit 和 lua 一样,是可以直接安装在操作系统中的,相关介绍直接参考官网 luajit。个人测试效果来看,luajit 的执行效率远高于 lua,大概是 8 倍左右。openresty 的 lua-nginx-module 模块就是将 luajit 集成到了 Nginx 中,实现在 Nginx 中执行 Lua 脚本

luajit ffi 是 luajit 提供给 Luaer 使用 Lua 调用 C 函数的 Lua 库,使用该库,Luaer 不用再去操作复杂的 Lua 栈来粘合两种程序代码,luajit ffi 官方资料

引入 luajit ffi 库

local ffi = require("ffi")

在 Lua 中调用 C 函数

和 lua 的 C API 一样,Lua 调用 C 函数,需要将 C 函数编译成链接库。区别在于 C API 查找 C 的 Lua 库是在 package.cpath 路径下进行查找,而这些库函数使用 Lua 栈接口进行编写。而 luajit 对于 C 链接库的引用遵从于普通 C 库的引用方式,先在 /usr/lib(/usr/lib64),/lib(/lib64) 目录下查找,再到用户自定义的 LD_LIBRARY_PATH 下查找。

  • 本节涉及接口:

    • ffi.cdef[[c_function define]]
    • ffi.C
    • ffi.load(name [,global])
  • 调用 C 标准库函数

    对于 C 标准库函数引用,需要引入函数,函数声明

    ffi.cdef[[c_function define]]
    

    调用 C 函数

    ffi.C.c_function
    

    如:

    local ffi = require("ffi")
    
    ffi.cdef[[
    int printf(const char *fmt, ...);
    int strcasecmp(const char *s1, const char *s2);
    ]]
    
    ffi.C.printf("Hello %s!\n", "world")
    ret = ffi.C.strcasecmp("Hello", "hello")
    print(ret)
    ret = ffi.C.strcasecmp("Hello", "hello1")
    print(ret)
    

    输出结果

    [root@AlexWoo-CentOS lua]# luajit ffic.lua 
    Hello world!
    0
    -49
    
  • 调用自定义的 C 函数

    调用自定义的 C 函数,首先要将自定义的 C 函数编译成链接库

    [root@AlexWoo-CentOS lua]# cat ffimyc.c 
    int add(int x, int y)
    {
        return x + y;
    }
    [root@AlexWoo-CentOS lua]# gcc -g -o libffimyc.so -fpic -shared ffimyc.c
    

    比调用 C 标准库函数,需要在 Lua 中引入相应的库

    ffi.load(name [,global])
    

    这里第二个参数如果为 true,则该库被引入全局命名空间,这里使用 ffi.load 需要注意两点:

    • 链接库文件必须在 C 的动态链接库查找路径中,否则会报类似错误:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值