luajit FFI简单使用(1)

四、FFI和第三方模块 目录 FFI 如何调用外部C库函数? Openresty自带很多luaJIT库 第三方模块 FFI FFI 库,是 LuaJIT 中最重要的一个扩展库。它允许从纯 Lua 代码调用外部 C 函数,使用 C 数据结构。有了它,就不用再像 Lua 标准math库一样,编写 Lua 扩展库。把开发者从开发 Lua 扩展 C 库(语言/功能绑定库)的繁重工作中释放出来。学习完本小节对... 阅读详情

本文参考了luajit的官方文档编写。文档的结构也基本上是按照官网的来。

luajit FFI是一个简化的调用c库函数的途径。目的是简化lua和c语言之间调用的繁琐的push和pop。如果你已经有一个c语言编写的一个库了,可以不改代码的前提下,使用lua直接调用。

开胃菜

调用函数

先使用c编写一个工程,对外部提供一个函数

int c_add(int a, int b);

编写makefile将其编译成一个libc_utils.so库文件出来。
在lua中定义这个c函数并且加载这个so库。

local ffi = require("ffi")
ffi.cdef[[
int c_add(int a,int b);
]]
local cutils = ffi.load('libc_utils')
print(cutils.c_add(200,50))

如果是在windows版本上,可以直接来执行这个命令:

local ffi = require("ffi")
ffi.cdef[[
int MessageBoxA(void *w, const char *txt, const char *cap, int type);
]]
ffi.C.MessageBoxA(nil, "Hello world!", "Test", 0)

将会直接调出一个dialog出来。

使用数据结构

在c库里面定义计算向量相关的函数。我们在代码里面实现一个向量的点×

概念

点乘(Dot Product)
几何意义:
A·B = |A| |B| cos(θ).
θ是向量A和向量B见的夹角。
计算公式:
V1( x1, y1) V2(x2, y2) = x1*x2 + y1*y2

代码实现

typedef struct { uint8_t x, y; } position;
int dot_produce(position *a, position *b);
int dot_produce(position *a, position *b) {
    int ret = (a->x) * (b->x) + (a->y * b->y);
    return ret;
}

lua中调用


local ffi = require("ffi")
ffi.cdef[[
typedef struct { uint8_t x, y; } position;
int dot_produce(position *a, position *b);
]]
local cutils = ffi.load('libc_utils')
local pos = ffi.new("position[?]", 2)
pos[0].x=10
pos[0].y=10
pos[1].x=500
pos[1].y=300
print(cutils.dot_produce(pos[0],pos[1]))

进阶

调用zlib库

local ffi = require("ffi")
1 ffi.cdef[[
unsigned long compressBound(unsigned long sourceLen);
int compress2(uint8_t *dest, unsigned long *destLen,
          const uint8_t *source, unsigned long sourceLen, int level);
int uncompress(uint8_t *dest, unsigned long *destLen,
           const uint8_t *source, unsigned long sourceLen);
]]
2 local zlib = ffi.load(ffi.os == "Windows" and "zlib1" or "z")

local function compress(txt)
3  local n = zlib.compressBound(#txt)
  local buf = ffi.new("uint8_t[?]", n)
4  local buflen = ffi.new("unsigned long[1]", n)
  local res = zlib.compress2(buf, buflen, txt, #txt, 9)
  assert(res == 0)
5  return ffi.string(buf, buflen[0])
end

local function uncompress(comp, n)
  local buf = ffi.new("uint8_t[?]", n)
  local buflen = ffi.new("unsigned long[1]", n)
  local res = zlib.uncompress(buf, buflen, comp, #comp)
  assert(res == 0)
  return ffi.string(buf, buflen[0])
end

-- Simple test code.
local txt = string.rep("abcd", 1000)
print("Uncompressed size: ", #txt)
local c = compress(txt)
print("Compressed size: ", #c)
local txt2 = uncompress(c, #txt)
assert(txt2 == txt)

1.将zlib中的函数方法都定义到ffi接口中;
2.开始加载zlib库的C库文件;
3.通过compressBound函数估算压缩包结果的size;并且new一块n大小的内存。
4.新建一个unsigned long的变量用于提供给compress2函数中作为返回,压缩之后内存块的长度。
调用compress2函数,将内存块加压。
5.将返回的内存块通过ffi.string转换成lua中的内存块。
后面的是他的逆过程。

在这段代码里面还是演示了一些功能:
关于ffi.new的用法。这个里面都演示了如何创建一块buf,如何创建一块内存,并且得到他的地址。
关于ffi.string,这个模块是用于将内存块和lua的string做转换时使用。

为c类型绑定上元表

local ffi = require("ffi")
ffi.cdef[[
typedef struct { double x, y; } point_t;
]]

local point
local mt = {
  __add = function(a, b) return point(a.x+b.x, a.y+b.y) end,
  __len = function(a) return math.sqrt(a.x*a.x + a.y*a.y) end,
  __index = {
    area = function(a) return a.x*a.x + a.y*a.y end,
  },
}
point = ffi.metatype("point_t", mt)

local a = point(3, 4)
print(a.x, a.y)  --> 3  4
print(#a)        --> 5
print(a:area())  --> 25
local b = a + point(0.5, 8)
print(#b)        --> 12.5

这个就是在lua里面加载一个c语言的struct,并且在这个对象里面绑定上lua的实现方法。这个其实很奇妙的一个功能,今后如果一个c库,想做成面向对象就能通过这个调配一下就好了。
在官网中的解释

The C type metamethod mechanism is most useful when used in conjunction with C libraries that are written in an object-oriented style.
初窥LuaJit中 --- 试用FFI 1.不知LuaJit的应该很多,但知道cocos2d应该很多。我初听LuaJit 还是有从一前辈口中得知,当时只听了大概原理。简单来说就是用C来封装核心库,用Lua 脚本来写业务,这个在做游戏方面很适用,同时我觉得也很适用需求更新较快的业务。 阅读详情

相关推荐

OpenResty从入门到精通08-LuaJIT分支和标准Lua有什么不同?

让我们来回顾下今天的内容。OpenResty 出于性能的考虑,选择了 LuaJIT 而不是标准 Lua,并且维护了自己的 LuaJIT 分支。而 LuaJIT 基于 Lua 5.1 的语法,并选择性地兼容了部分 Lua5.2 和 Lua5.3 的语法,形成了自己的体系。至于你需要掌握的Lua 语法,在下标、字符串拼接、数据结构和变量上,都有自己鲜明的特点,在写代码的时候你应该特别留意。你在学习 Lua 和 LuaJIT 的时候,是否遇到一些陷阱和坑呢?

fegus的博客 979

【LuaJIT & FFI】优雅的与C交互

LuaJIT和FFI是两个非常强大的工具,它们可以帮助开发人员在Lua中实现高性能的代码。

Cauchy的博客 3338

luajit集成篇/平台相关篇 | 合理用好lua+unity,更省性能的方案整理

luajit集成篇 大家都知道luajit比原生lua快,快在jit这三个字上。 但实际情况是,luajit的行为十分复杂。尤其jit并不是一个简单的把代码翻译成机器码的机制,背后有很多会影响性能的因素存在。

m0_58523831的博客 1万+

lua ffi.string

缘起使用ffi给lua包一个rsa算法, 刚刚学习ffi,连文档都没仔细看过,当返回加密结果时,如果直接返回CDATA,则解密没有问题,如果转为lua string(使用ffi.string) ,则后续无法解密调试直接在lua中调试基本无法凑效重新编译openssl的libcrypt库,加入调试信息,先是祭出gdb,调的晕乎乎的;然后,则可以地方修改C代码,打印调试信息发现,使用ffi.strin...

章志强的专栏 4695

996引擎 - M2 服务端 LuaJIT 2.1 运行环境能力测试报告

测试日期:2026-08-25运行平台:Windows x64Lua 环境:Lua 5.1 兼容层 / LuaJIT 2.1.ROLLING测试对象:996M2 服务端内嵌 LuaJIT 环境。

灵台方寸山斜月三星洞 242

RK3588多路MIPI摄像头采集与WiFi低延迟传输实战指南

本文详细介绍了基于RK3588平台实现多路MIPI摄像头同步采集并通过WiFi进行低延迟传输的完整实战方案。文章深入剖析了从V4L2驱动配置、多线程采集、环形缓冲区设计到UDP网络传输优化的核心技术,旨在帮助开发者在工业检测、智能安防等场景下构建高并发、高实时性的视频流系统,实现端到端延迟控制在100毫秒以内的目标。

tensor9flow的博客 786

open-slide 项目模板完全指南:从零开始创作 AI Agent 驱动的 React 幻灯片

open-slide 是一个面向 Agent(如 Claude Code)设计的幻灯片框架,其核心思路是“Slides as React components”——每张幻灯片就是一个普通的 React 模块,运行时负责布局、缩放、导航与演示。本文以官方脚手架生成的项目模板([packages/cli/template](https://link.gitcode.com/i/378dc0b86969

gitblog_01055的博客 184

关于SVPWM七段式五段式调制后的相电压和线电压波形——大疆DJI技术笔试

1.SVPWM七段式/五段式调制的相电压和线电压波形 脉宽调制(PWM)在并网变流技术中得到了广泛的应用。与正弦脉宽调制(SPWM)的控制方法相比,SVPWM方法具有直流侧电压利用率高,电压谐波小,易于数字化实现等显著的优点,从而使SVPWM在实际的应用中越来越普遍。TMS320F28335是32位浮点的DSP控制器,具有150MHz的高速处理能力,18路PWM输出,与前几代数字信号控制器相比,性能平均提高了50%。其中具体的SVPWM理论实现的原理,请参考我的博客永磁同步电机的矢量控制策略(七)一一一SV

昔时扬尘处 2万+

OpenResty为什么选择LuaJIT 2.1?JIT编译器与FFI机制完整指南(基于官方文档深度解读)

**OpenResty 为什么选择 LuaJIT 2.1?** 因为 OpenResty 是基于 Nginx 和 LuaJIT 构建的高性能 Web 平台,而 LuaJIT 2.1 是 Lua 语言最快的即时编译器(JIT Compiler)之一,其独有的 FFI(外部函数接口)机制让纯 Lua 代码可以直接调用 C 函数,这正是 OpenResty 能在 Web 场景下保持极致性能的核心原因。本

gitblog_01055的博客 300

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 281

虚拟机Ubuntu连接USRP

笔记本通过网线连接USRP。

xiaozir的博客 2305

LuaJIT入门教程:5分钟快速搭建高性能Lua开发环境

想要体验**高性能Lua编程**的魅力吗?LuaJIT作为Lua语言的即时编译器,能够将Lua代码的运行速度提升数倍,是游戏开发、嵌入式系统和脚本优化的终极选择。本教程将带你用5分钟时间完成LuaJIT开发环境的完整搭建。 ## 什么是LuaJIT? LuaJIT是一个高性能的Lua解释器和即时编译器,它完全兼容标准的Lua 5.1语言规范。与标准Lua相比,LuaJIT通过先进的JIT编译技

gitblog_00537的博客 756

Python爬虫实战:逆向工程与异步处理攻克Pinterest无限滚动瀑布流

我们将从零开始,逐步分析其数据接口,构建一个功能完整的爬虫,并深入探讨反爬虫策略的应对、性能优化以及数据存储等高级主题。: 在实际爬取中,你需要先访问一次Pinterest主页,获取初始的Cookie和CSRF Token,然后再发起API请求。: Python爬虫,Pinterest,无限滚动,瀑布流,异步IO,httpx,逆向工程,API接口,动态内容,反爬虫。你会很快发现一些关键的请求模式。:页面初始加载有限内容,随着用户滚动,新的图片块通过AJAX动态加载,实现“永无止境”的浏览。

2201_76125261的博客 551

推荐使用:LuaJIT 2.1 - 高性能的Lua JIT编译器

LuaJIT 2.1 是一款由Mike Pall开发的高效能的Just-In-Time(JIT)编译器,专为动态脚本语言Lua设计。作为开源软件,它遵循MIT许可,允许自由使用和分发。该项目的主页位于[https://luajit.org/](https://luajit.org/),在这里你可以找到详细的文档和最新信息。 ## 项目技术分析 LuaJIT 的核心优势在于其优化的JIT编译引擎...

gitblog_00077的博客 957

MIPI C-PHY介绍(Specification for C-PHY V1.2)

本文档描述了一个名为C-PHY的高速串行接口,它在带宽有限(bandwidth limited channels,看的有人说C的含义就是channel limit)的通道上提供高吞吐量性能,用于连接到外设,包括显示器和摄像头。首先0x4fff在0x4000~0x4fff区域,则f=(0,0,0,0,0,0,1),顺序是S6~S1;最后,端到端的传输过程是什么样呢,如下图所示,16bit先转换成7个符号(每个符号3位,共21位),然后并行数据转换成串行数据,输送到符号编码器和3个线的驱动器,接收端流程相反。

qflook的博客 5871

CVPR 2026 即插即用 | 注意力篇 | MSEF:超轻注意力,空间-通道双分支并行融合,既增强特征又抑制噪声!

Multinex提出了一种超轻量级微光图像增强框架,其核心创新是MSEF模块。MSEF采用双分支并行架构,结合空间局部特征(深度可分离卷积)和全局通道注意力(改进SE),通过Tanh激活实现特征增强与抑制。相比传统注意力模块,MSEF在几乎不增加计算量的情况下显著提升性能,特别适合轻量级网络和边缘设备部署。实验表明,该模块能有效提升PSNR约3dB,同时保持极低的参数量(0.7K-45K)。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 601

3.luajit简介

--------------------- luajit环境 openresty使用的解释器不是官方的lua解释器,而是第三方的luajit,为的是追求极致的性能 luajit=汇编编写的解释器+jit编译器 基于lua5.1 goto for i=1,10 do if i%2==0 then goto continue end print("i=",i) ::cont...

Salted fish in hand, I have the world. 399

基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机

目录基于Simulink的自适应控制(Adaptive Control)电励磁同步电动机项目实例1. 项目背景2. 系统架构2.1 电励磁同步电动机模型2.2 三相逆变器模型2.3 自适应控制器(Adaptive Controller)2.4 系统框图3. 模型设计3.1 创建Simulink模型3.2 自适应控制(Adaptive Control)设计3.3 仿真环境搭建4. 参数优化4.1 自动调优5. 实际应用案例5.1 工业驱动系统5.2 风力发电系统6. 结论进一步优化建议需求分析电励磁同步电动机

MHD0815的博客 266

终极Lua性能加速方案:LuaJIT 2.1完整指南

LuaJIT 2.1是一款革命性的高性能即时编译器,专为动态脚本语言Lua设计。作为OpenResty团队维护的分支版本,它提供了比标准Lua解释器高出数倍的执行速度,同时保持完全兼容Lua 5.1语法。无论您是游戏开发者、Web后端工程师还是嵌入式系统程序员,LuaJIT都能为您的项目带来显著的性能提升。 ## 为什么选择LuaJIT作为您的首选脚本引擎 LuaJIT的核心优势在于其先进的即

gitblog_00069的博客 805

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LuaJIT 2.1终极指南:高性能脚本引擎的完整解析与实战

LuaJIT 2.1是一款基于OpenResty分支的高性能Just-In-Time编译器,专为Lua语言优化设计。该项目在保持Lua语言简洁特性的同时,通过先进的即时编译技术将脚本代码转换为高效的机器码,为开发者提供接近原生C语言的执行性能。作为开源项目,它遵循MIT许可证,支持自由使用和二次开发。 ## 核心技术架构深度剖析 ### JIT编译引擎工作原理 LuaJIT的核心技术在于其独特

gitblog_01200的博客 975

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

LuaJIT 2.1终极指南:如何让Lua脚本运行速度提升10倍以上

你是否在为Lua脚本的性能瓶颈而烦恼?想要让游戏逻辑、Web服务器或嵌入式系统的运行速度获得质的飞跃?LuaJIT 2.1就是你的解决方案!作为OpenResty分支的LuaJIT实现,这款高性能即时编译器能够将Lua代码的执行速度提升5-10倍,让脚本语言也能拥有接近原生代码的性能表现。 ## 🚀 为什么选择LuaJIT而不是标准Lua? 传统的Lua解释器虽然灵活易用,但在性能要求高的场

gitblog_00562的博客 863

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OpenResty/luajit2完全指南:从入门到精通的高性能Lua JIT编译器

OpenResty/luajit2是一款高性能的Lua JIT编译器,它在标准Lua的基础上提供了即时编译功能,能够显著提升Lua代码的执行速度。本指南将带你全面了解这款强大工具的安装、配置、核心功能及性能优化技巧,帮助你快速掌握并充分发挥其高性能特性。 ## 一、什么是OpenResty/luajit2? LuaJIT是一款即时编译(JIT)的Lua引擎,它不仅完全向上兼容Lua 5.1,还

gitblog_00230的博客 871

LuaJIT分支和标准Lua有什么不同?

这节课,我们来学习下 OpenResty 的另一块基石:LuaJIT。今天主要的篇幅,我会留给 Lua 和 LuaJIT 中重要和鲜为人知的一些知识点。而更多 Lua 语言的基础知识,你可以通过搜索引擎或者 Lua 的书籍自己来学习,这里我推荐 Lua 作者编写的《Lua 程序设计》这本书。 当然,在 OpenResty 中,写出正确的 LuaJIT 代码的门槛并不高,但要写出高效的 LuaJIT 代码绝非易事,这里的关键内容,我会在后面 OpenResty 性能优化部分详细介绍。 我们先来看下 LuaJI

张俊杰 的博客 1万+

luajit开发文档中文版(二)LuaJIT扩展

2022年6月10日15:33:04 luajit开发文档中文版(一)下载和安装 luajit开发文档中文版(二)LuaJIT扩展 luajit开发文档中文版(三)FAQ 常见问题 luajit开发文档wiki中文版(一) 总目录 luajit开发文档wiki中文版(二) LuaJIT 扩展 luajit开发文档wiki中文版(三)性能调优和测试 luajit开发文档wiki中文版(四) ...

Z.X的博客 1745

LuaJIT终极指南:如何为你的Lua应用加速10倍以上

你是否曾经为Lua脚本的运行速度感到困扰?如果你的游戏、Web应用或嵌入式系统使用了Lua,那么性能瓶颈可能是你最头疼的问题。今天我要介绍的LuaJIT正是解决这个问题的完美方案——它是一个Lua即时编译器,能够让你的Lua代码运行速度提升10倍甚至更多!🚀 LuaJIT是Lua编程语言的即时编译器实现,它不仅完全兼容标准的Lua 5.1 API,还通过JIT编译技术将Lua代码直接编译成机器

gitblog_00151的博客 661

LuaJIT 2.1 - 终极高性能Lua JIT编译器完整指南

LuaJIT 2.1是一款革命性的高性能Lua JIT编译器,通过即时编译技术将Lua脚本转换为机器码,实现接近原生代码的执行速度。作为OpenResty分支的LuaJIT实现,它为开发者提供了前所未有的Lua性能优化能力。 ## 什么是LuaJIT及其核心优势 LuaJIT是一个基于Lua 5.1的即时编译器,专门为追求极致性能的开发者设计。与传统的Lua解释器相比,LuaJIT能够动态分析

gitblog_01020的博客 1133
上一篇: cmake套路介绍
下一篇: 使用python内建asyncore编写socket client
erlang_hell
博客等级 码龄14年 57粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值