• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Lua与C语言间的交互实例

    Lua 是一门轻巧、灵活、扩展性很强的脚本语言,它可以很容易的嵌入到其他语言(C/C++)中使用,这主要得益于其提供了功能强大的 C API,这让其跟 C/C++ 间的互调成为一件很轻松的事。

    Lua 调用 C

    Lua 调用 C 函数,其实就是把 C 函数注册到 Lua 中去,把 C 函数地址传递给 Lua 解释器。这个传递是要遵循一个的协议的,即:

    复制代码 代码如下:

    typedef int (*lua_CFunction)(lua_State* L)

    Lua 和 C 是通过栈(State)来交互的,Lua 调用 C 函数时,首先 Lua 把数据拷贝到栈上,然后 C 从栈上获取数据,调用结束后将返回结果放到栈中。栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引,索引值以1或-1为起始值,因此栈顶索引值永远为-1 ,栈底索引值永远为1 。栈相当于数据在 Lua 和 C 之间的中转站,每一个 C 函数都有自己的独立的私有栈。

    利用 Lua 提供的 C API,调用 C 函数很简单,例如下面例子:

    复制代码 代码如下:

    #include math.h>
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
     
     
    static int l_sin (lua_State *L)
    {
        double d = luaL_checknumber(L, 1);
        lua_pushnumber(L, sin(d));
        return 1;
    }
     
    static const struct luaL_Reg mylib [] = {
        {"lsin", l_sin},
        {NULL, NULL}
    };
     
    int luaopen_mylib(lua_State *L)
    {
        luaL_openlib(L, "mylib", mylib, 0);
        return 1;
    }

    把上面代码编译成一个静态资源的 so 文件,加入把上面代码保存在一个名为 mylib.c 的文件下,把它编译成一个名为 libmylib.so 的静态资源文件里,gcc 编译语句如下:

    复制代码 代码如下:

    gcc mylib.c -fPIC -shared -o libmylib.so

    把上面代码放在 LUA_CPATH 目录下(LUA_CPATH 目录位置说明详看《Lua 学习笔记(4) -- 模块与包》,这里就不多说了)。

    把 libmylib.so 资源文件加载到模块目录下后,就可以在 Lua 代码里直接加载 require 进来使用,例如如下使用:

    复制代码 代码如下:

    require "mytestlib"
    print(mylib1.lsin(10))

    您可能感兴趣的文章:
    • 简单谈谈lua和c的交互
    • Lua和C语言的交互详解
    • Lua教程(二十):Lua调用C函数
    • C++中调用Lua函数实例
    • Lua中调用C++函数实例
    • Lua调用自定义C模块
    • Lua和C++的通信流程分解
    • Lua中调用C语言函数实例
    • C#和lua相互调用的方法教程
    上一篇:Lua模块与包学习笔记
    下一篇:Lua数据类型介绍
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Lua与C语言间的交互实例 Lua,与,语言,间的,交互,实例,