当前位置: 首页 > article >正文

lua脚本调用 c/c++中的接口

脚本的使用

local b,i,f,s = luascriptCallCpp(true,2,3.4,"hellocpp")
print("haha=",b,i,f,s)

脚本调用c/c++接口,脚本的第一个入参在栈底,最后一个入参在栈顶

c/c++接口的返回参数,第一个入栈的参数为脚本中的第一个返回值,依次类推。

c/c++接口函数的返回值int,表示lua脚本端的返回参数个数。

在c/c++端,获取脚本传入的参数方式1:依次从栈底开始取。

int exportLuascriptCallCpp1(lua_State* L)
{
    int iParams = lua_gettop(L); //获取参数个数
    if (lua_isboolean(L, 1)) {
        std::cout << 1 << "bool:" << std::boolalpha << lua_toboolean(L, 1) << '\n';
    }
    if (lua_type(L, 2) == LUA_TNUMBER && lua_isinteger(L, 2)) {
        std::cout << 2 << "int:" << lua_tointeger(L, 2) << '\n';
    }
    if (lua_type(L, 3) == LUA_TNUMBER && !lua_isinteger(L, 3)) {
        std::cout << 3 << "number:" << lua_tonumber(L, 3) << '\n';
    }
    if (lua_isstring(L, 4)) {
        std::cout << 4 << "string:" << lua_tostring(L, 4) << '\n';
    }

    lua_pushboolean(L, true);
    lua_pushinteger(L, 1);
    lua_pushnumber(L, 2.3);
    lua_pushstring(L, "returndata");

    return 4;
}

在c/c++端,获取脚本传入的参数方式1:依次从栈顶开始取,并且每次取出一个后lua_pop掉栈顶元素,所以获取下一个元素时依然是从栈顶开始。

int exportLuascriptCallCpp(lua_State* L)
{
    if (lua_isstring(L, -1)) {
        std::cout << 1 << "string:" << lua_tostring(L, -1) << '\n';
    }
    lua_pop(L, 1);
    if (lua_type(L, -1) == LUA_TNUMBER && !lua_isinteger(L, -1)) {
        std::cout << 1 << "number:" << lua_tonumber(L, -1) << '\n';
    }
    lua_pop(L, 1);
    if (lua_type(L, -1) == LUA_TNUMBER && lua_isinteger(L, -1)) {
        std::cout << 1 << "int:" << lua_tointeger(L, -1) << '\n';
    }
    lua_pop(L, 1);
    if (lua_isboolean(L, -1)) {
        std::cout << 1 << "bool:" << std::boolalpha << lua_toboolean(L, -1) << '\n';
    }

    lua_pushboolean(L, true);
    lua_pushinteger(L, 1);
    lua_pushnumber(L, 2.3);
    lua_pushstring(L, "returndata");
    return 4;
}

最后别忘记了要导出(注册)c/c++接口到lua的环境变量中。

static const luaL_Reg exportLib[] = {
    {"luascriptCallCpp",exportLuascriptCallCpp},
    {NULL, NULL}
};

for (const luaL_Reg*lib = exportLib; lib->func; ++lib)
{
    lua_register(L, lib->name, lib->func);
}


http://www.kler.cn/a/388467.html

相关文章:

  • 使用electron-egg把vue项目在linux Ubuntu环境下打包并安装运行
  • 云原生-docker安装与基础操作
  • mysql 实现分库分表之 --- 基于 MyCAT 的分片策略详解
  • GitLab实现 HTTP 访问和 SMTP 邮件发送
  • 通用项目工程的过程视图概览
  • Chromium 中sqlite数据库操作演示c++
  • Spring Shell——快速构建终端应用,自定义终端命令
  • Maven的依赖管理、传递、冲突、父子工程的继承和聚合
  • 题目讲解15 合并两个排序的链表
  • 易语言加载dll模拟windows鼠标轨迹移动
  • 对于大根堆的计算时间复杂度的过程
  • 【模板】如何实现链表元素的反转
  • ClickHouse创建分布式表
  • 用Java实现samza转换成flink
  • linprog函数在octave中的使用
  • WPF中ImageBrush和Image的区别
  • 斐波那契数的第n个数代码分享(c基础)
  • 【如何使用 ADB 脚本批量停止 Android 设备上的所有应用】
  • 基于WebService的面向服务架构研究
  • 浅谈“通感一体”
  • el-table 表格索引不展示问题
  • Golang | Leetcode Golang题解之第556题下一个更大元素III
  • Facebook定位不准是什么原因?
  • 零基础入门进程间通信:task 1(匿名管道与vscode使用)
  • JS如何读取JSON数据并且格式化解析?
  • 京准同步:GPS北斗卫星授时服务器发展趋势介绍