收藏官网首页
查看: 13491|回复: 1

Lua 调用 C

51

主题

99

帖子

827

积分

高级会员

Rank: 4

积分
827
跳转到指定楼层
楼主
发表于 2016-11-7 18:17:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
校园创客福利
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 目录下把 libmylib.so 资源文件加载到模块目录下后,就可以在 Lua 代码里直接加载 require 进来使用,例如如下使用:

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

562

主题

1222

帖子

8127

积分

版主

Rank: 7Rank: 7Rank: 7

积分
8127
沙发
发表于 2016-11-8 09:26:53 | 只看该作者
Python lua 大数据处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表