Lua与C语言间的交互实例

 更新时间:2014年12月10日 11:23:59   投稿:junjie  
这篇文章主要介绍了Lua与C语言间的交互实例,本文主要讲解了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中if语句嵌套的使用教程

    Lua中if语句嵌套的使用教程

    这篇文章主要介绍了Lua中if语句嵌套的使用教程,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • 实例讲解Lua中pair和ipair的区别

    实例讲解Lua中pair和ipair的区别

    这篇文章主要介绍了实例讲解Lua中pair和ipair的区别,本文直接用实例代码来讲解pair和ipair的区别,需要的朋友可以参考下
    2015-04-04
  • Lua入门学习笔记

    Lua入门学习笔记

    这篇文章主要介绍了Lua入门学习笔记,本文适合有一定编程基础的同学,可以依据本文快速入门Lua脚本语言,需要的朋友可以参考下
    2014-10-10
  • Lua教程(四):在Lua中调用C语言、C++的函数

    Lua教程(四):在Lua中调用C语言、C++的函数

    这篇文章主要介绍了Lua教程(四):在Lua中调用C语言、C++的函数,本文给出了多个示例讲解如何在Lua中调用C/C++写的函数,需要的朋友可以参考下
    2014-09-09
  • Lua中的函数精讲笔记

    Lua中的函数精讲笔记

    这篇文章主要介绍了Lua中的函数精讲笔记,本文讲解了函数的用途、可变参数函数、闭包、非全局函数等内容,需要的朋友可以参考下
    2015-04-04
  • Lua中计算、执行字符串中Lua代码的方法

    Lua中计算、执行字符串中Lua代码的方法

    这篇文章主要介绍了Lua中计算、执行字符串中Lua代码的方法,类似JavaScript中eval函数的功能,在Lua中也可以实现,需要的朋友可以参考下
    2015-05-05
  • Lua中设置table为只读属性的方法详解

    Lua中设置table为只读属性的方法详解

    这篇文章主要给大家介绍了关于Lua中设置table为只读属性的方法,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-07-07
  • Lua学习笔记之类型与值

    Lua学习笔记之类型与值

    本文详细的总结了Lua中的类型与值,对于实际编程中容易出错的地方也进行了详细的总结,十分的全面实用。有需要的小伙伴可以参考下。
    2015-04-04
  • Lua时间转化的几个小例子

    Lua时间转化的几个小例子

    这篇文章主要介绍了Lua时间转化的几个小例子,本文直接给出3段例子代码,需要的朋友可以参考下
    2015-06-06
  • Lua 中 pairs 和 ipairs 的区别

    Lua 中 pairs 和 ipairs 的区别

    这篇文章主要介绍了Lua 中 pairs 和 ipairs 的区别,本文用官方文档和代码实例总结了它的们的区别,需要的朋友可以参考下
    2014-09-09

最新评论