zoukankan      html  css  js  c++  java
  • lua ffi简介

    本文转自网络

    由来

    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/C API函数调用。

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

    安装LuaJIT

    mkdir -p ~/lua-ffi_in_action && cd ~/lua-ffi_in_action
    git clone http://luajit.org/git/luajit-2.0.git
    cd luajit-2.0
    make && make install
    

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

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

    操作步骤如下:

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

    执行
    wss@localhost:~/lua/train/ffi$ luajit test.lua
    99
    Hello world

    事实上,背后的实现远非如此简单:③ 使用标准C库的命名空间ffi.C。通过符号名("printf")索引这个命名空间,自动绑定标准C库。索引结果是一个特殊类型的对象,当被调用时,执行printf函数。传递给这个函数的参数,从Lua对象自动转换为相应的C类型。

  • 相关阅读:
    常见的查找算法(七):哈希查找
    常见的查找算法(六):分块查找
    常见的查找算法(五):树表查找之一 ---- 二叉查找树
    让div充满整个body
    display:table的用法
    webpack-dev-server
    webpack--loader
    webpack nodejs npm关系
    js中==和===区别
    vue 的点击事件怎么获取当前点击的元素
  • 原文地址:https://www.cnblogs.com/thinkinglife/p/5237979.html
Copyright © 2011-2022 走看看