Lua Call C function

Lua脚本可以和C函数灵活的结合,Lua脚本作为控制语言,使用C函数来做性能计算部分。
Lua脚本的执行器有Lua 和 Luajit。
使用Lua执行器,可以通过C语言注册C函数到Lua State, 然后Lua脚本可以调用该C函数。

使用Luajit,支持FFI,可以支持 require(“libxxx.so”) , 通过函数符号表请求,同时Luajit也可以支持调用主程序的函数。
本文将展示Lua脚本直接调用主程序函数的例子。

主程序导出动态符号表

主程序默认是没有自定义的函数的符号的
请添加图片描述

编译选项增加 -rdynamic

就包含了自定义函数的动态符号表
请添加图片描述

Lua查找并使用C函数

引用ffi,先定义函数

local ffi = require("ffi")-- 1. 先做C接口定义
ffi.cdef[[bool SendMsg(const char* json_str, const char* str1, const char* str2, int pri);int AddNumbers(int a, int b);
]]-- 测试基本函数调用
print("\n基本函数调用:")
local result = ffi.C.SendMsg('{"temp": 25.5}', "data", "sensor", 0)
print("Send result:", result)

Makefile指定Luajit执行器

Luajit是必须的,如果是lua执行器,则不支持该操作

TARGET = test2SRCS = $(wildcard *.cpp)CC = g++CFLAGS += -g -O2 -std=c++11 -I/usr/local/include/luajit-2.1/LDFLAGS += -lyaml-cpp -L/usr/local/lib -lluajit-5.1 -ldl -rdynamic
all: $(TARGET)$(TARGET): $(SRCS)$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS).PHONY: clean
clean:rm $(TARGET)

C代码定义函数,执行Lua

luaL_dofile 即执行指定Lua脚本

    lua_State *L = luaL_newstate();luaL_openlibs(L);// Load Lua scriptif (luaL_dofile(L, "advanced_ffi.lua") != LUA_OK) {fprintf(stderr, "Error loading Lua script: %s\n", lua_tostring(L, -1));lua_close(L);return 1;}lua_close(L);

完整代码simple_ffi.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
extern "C" {#include "lua.h"#include "lauxlib.h"#include "lualib.h"#include <stdint.h>// 要被Lua FFI调用的C函数
bool SendMsg(const char* json_str, const char* str1, const char* str2, int pri) {printf("=== C Function Called ===\n");printf("JSON: %s\n", json_str ? json_str : "NULL");printf("str-1: %s\n", str1 ? str1 : "NULL"); printf("str-2: %s\n", str2 ? str2 : "NULL");printf("Priority: %d\n", pri);if (!json_str || !str2) {printf("ERROR: Missing required parameters\n");return false;}printf("Message sent successfully!\n");return true;
}int AddNumbers(int a, int b) {printf("C function: %d + %d = %d\n", a, b, a + b);return a + b;
}const char* GetVersion() {return "FFI Demo v1.0";
}}int main() {printf("C Program: Functions are ready for FFI access\n");printf("You can now run: luajit ffi_test.lua\n");// 演示直接调用printf("\nDirect C calls:\n");SendMsg("{\"test\":\"data\"}", "sub", "title", 5);printf("Add result: %d\n", AddNumbers(10, 20));printf("Version: %s\n", GetVersion());lua_State *L = luaL_newstate();luaL_openlibs(L);// Load Lua scriptif (luaL_dofile(L, "advanced_ffi.lua") != LUA_OK) {fprintf(stderr, "Error loading Lua script: %s\n", lua_tostring(L, -1));lua_close(L);return 1;}lua_close(L);printf("All tests completed successfully.\n");return 0;
}

测试

导出函数符号表的test2,执行成功。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94052.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94052.shtml
英文地址,请注明出处:http://en.pswp.cn/web/94052.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

农业-学习记录

1-git上传&#xff08;简易版&#xff09;首先&#xff0c;记得vscode打开的项目路径是/home/Agribrain。不然会提示上传很多项目无关的文件。① 暂存所有更改②使用vscode终端注意&#xff1a;终端打开路径&#xff1a;/home/Agribrain/agribrain【git项目的所在目录】&#x…

什么是数据集成?数据集成对数据治理有什么影响

在大数据与人工智能驱动的时代&#xff0c;数据已经成为企业的“新型生产力”。然而&#xff0c;企业内部数据往往分散在不同系统、不同格式、甚至不同地域中。如果缺乏有效管理与整合&#xff0c;数据价值就无法真正释放。这时&#xff0c;“数据集成”应运而生&#xff0c;它…

技术成长战略是什么?

文章目录技术成长战略是什么&#xff1f;1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议技术成长战略是什么&#xff1f; 1. 前言 在波波的微信技术交流群里头&am…

从0到1打造一台机器人走起来

聚焦仿人双足机器人,着重解决其下肢鲁棒行走中仿真到实机间隔(SimToReal gap)的误差问题 总述 硬件:采用傅利叶智能科技一体化关节模组: 1)胯部和膝关节选用 FSA80 - 29E 电机,以承受较大扭矩; 2)大腿部分采用 FSA60 - 43E 电机,兼顾扭矩和转速需求; 3)小腿选用 …

【Cmake】Cmake概览

目录 一.环境准备 1.1.Cmake安装 1.2. VSCodeCMake插件安装 1.3 快速样例-helloworld⼯程 二. cmake的基础命令⾏使用示例 2.1.文件准备 2.2.⽣成构建系统 2.3.编译连接 2.4.测试Ctest模块 2.5.测试安装模块 2.6.测试打包模块 2.7 查看帮助 CMake语法简洁清晰&…

概率核心概念学习笔记:随机事件与样本空间、古典概率与条件概率、全概率公式与贝叶斯公式

目录 一、 随机事件与样本空间 1. 原理讲解 2. 类型与关系 3. 案例计算 4. 应用场景 二、 古典概率与条件概率 1. 古典概率 (Classical Probability) 2. 条件概率 (Conditional Probability) 三、 全概率公式与贝叶斯公式 1. 全概率公式 (Law of Total Probability) …

优考试局域网系统V6.0.0版

优考试局域网系统迎来V6.0.0版本更新&#xff0c;核心在于提升功能性能与优化操作体验。重点对学情分析、移动端考试支持、考试监控和答题体验等方面进行了实用性更新&#xff0c;进一步提升了局域网环境下考试系统的灵活性与管理效率。 一、增加学情分析功能&#xff0c;教学…

Autosar之Com模块

Com模块主要实现了Signal在I-PDU中的封装及解析功能,为RTE层提供了基于Signal的发送与接收接口,实现了基于Signal的网关功能,实现了PDU的不同发送模式,以及Signal滤波,Update bit,Pdu Counter等功能 图 Com模块层次图 Com模块处于AUTOSAR架构中的通信服务层,其下层模块…

【iOS】NSRunLoop

目录 概念 RunLoop与线程的关系 Runloop对外的接口 CFRunLoopSourceRef Source0 Source1 CFRunLoopTimer CFRunLoopObserver RunLoop的Mode 应用场景 Runloop的内部逻辑 Runloop应用 tableView延迟加载图片&#xff0c;保证流畅 Timer不被ScrollView的滑动影响 A…

HTTP接口鉴权方式

几种主流且可行的HTTP接口鉴权方式&#xff0c;从简单到复杂&#xff0c;各有其适用场景。我将它们分为两大类&#xff1a;传统方式和现代方式。一、传统方式这类方式简单易用&#xff0c;但通常安全性较低或扩展性较差&#xff0c;适用于内部系统或简单API。1. HTTP Basic Aut…

DIC技术极端环境案例分享:系泊链在海水环境下氢脆化性能测试

实验结果的具体视频可详见以下链接&#xff1a;研索仪器DIC技术在极端条件下的应用 01 海水环境&#xff1a; DIC技术在海水环境下的应用核心挑战在于恶劣的光学条件&#xff08;如散射、衰减、畸变&#xff09;、严酷的化学/生物环境&#xff08;腐蚀、生物污损&#xff09;…

DL00291-联邦学习以去中心化锂离子电池健康预测模型完整实现

联邦学习在锂离子电池健康预测中的应用&#xff1a;去中心化训练与客户选择策略在锂离子电池健康预测领域&#xff0c;随着电池使用环境的多样化以及电池状态监测需求的不断增长&#xff0c;传统的集中式数据训练方法逐渐显现出局限性。为了解决数据隐私保护和大规模数据集中处…

TCP协议大全

什么是TCP&#xff1f;基本定义与属性TCP&#xff08;传输控制协议&#xff09;是传输层的重要协议&#xff0c;具有面向连接&#xff08;传输前需先建立连接&#xff0c;是发送方和接收方的点对点一对一连接&#xff09;、基于字节流&#xff08;以字节流形式传输数据&#xf…

当硅基生命遇见碳基萌宠:Deepoc具身智能如何重新定义“宠物监护者”

在东京某高级公寓里&#xff0c;一只布偶猫正优雅地踱步到智能喂食器前。令人惊讶的是&#xff0c;这个通体雪白的喂食器突然"活"了过来——它微微倾斜身体&#xff0c;用柔和的机械音发出问候&#xff0c;同时伸出仿生机械臂轻轻抚过猫咪的背部。这不是科幻电影场景…

线上日志排查问题

1、查异常堆栈 显示该行及其后面的50行内容&#xff0c;然后通过 less 命令进行分页查看 grep -A 50 "NullPointerException" a.log | less参数解释&#xff1a; grep: 文本搜索命令-A 50: After 的意思&#xff0c;显示匹配行后面的50行“NullPointerException”: 要…

LabVIEW与CAN开发燃料电池监控

​基于 LabVIEW 与 CAN 总线技术&#xff0c;构建了一套多组质子交换膜燃料电池&#xff08;PEMFC&#xff09;堆监控系统。系统采用优质硬件设备&#xff0c;通过 LabVIEW 的图形化编程能力实现数据采集、实时监控与多堆切换控制&#xff0c;稳定可靠&#xff0c;为燃料电池性…

CVPR焦点 | 神经网络新范式:轻量化与精度并行,重塑视觉任务性能天花板

关注gongzhonghao【CVPR顶会精选】神经网络卷积想找新亮点&#xff1f;不妨考虑&#xff1a;动态结构设计。作为深度学习架构搜索与高效建模两大热点的结合&#xff0c;动态神经网络凭借自适应推理与高效特征利用的优势&#xff0c;在视觉识别、视频理解等任务中脱颖而出&#…

机器学习之集成算法学习

一、集成学习概述集成学习&#xff08;ensemble learning&#xff09;通过构建并结合多个个体学习器来完成学习任务&#xff0c;核心思想是 “集众家之长”—— 就像多个专家共同判断往往比单个专家更可靠。其关键在于如何生成多样化的个体学习器并设计有效的结合策略。结合策略…

Unreal Engine UE_LOG

Unreal&#x1f3ae; Unreal Engine - UE_LOG&#x1f4dd; 定义&#x1f3db; 类/宏关联⚡ 关键特性&#x1f6e0;️ 常见配置&#x1f4da; 使用方法&#x1f527; 基础语法&#x1f50d; 示例&#x1fa82; 典型应用场景&#x1f517; 与其他组件对比⚠️ 常见问题与注意事项…

Halcon那些事:什么是动态阈值,如何用dyn_threshold分割图片

Halcon那些事:什么是动态阈值,如何用dyn_threshold分割图片 一、什么是动态阈值?为什么需要它? 1. 传统全局阈值的局限性 2. 动态阈值的核心思想 二、Halcon 中的核心算子:`dyn_threshold` 1. 算子原型 2. 参数详解 三、工作原理(数学模型) 四、详细使用步骤与实例 五、关…