LUA调用C

lua解析中集成了一些系统服务, 故脚本中可以访问系统资源, 例如, lua脚本可以调用文件系统接口, 可以调用数学库,

但是总存在一些lua脚本中访问不到的系统服务或者扩展功能, 如果这些系统服务或者扩展功能是使用C语言实现,

那么可以, 使用lua库的对C库的封装方法, 将其中功能封装成lua 接口, 这样脚本就调用这些lua接口调用这些功能。

-------

这种情况,是以lua脚本作为宿主程序。

C调用LUA

另外一种场景,是C程序作为宿主程序, 调用LUA脚本, 例如将lua脚本做配置文件功能,

C语言调用 Capi运行lua脚本, 并取得其中配置的值。

本例结合第一种情况, 介绍C中如何获得lua脚本的表参数。

LUA C API

lua c api 介绍 : http://www.cnblogs.com/stephen-liu74/archive/2012/07/18/2433428.html

主要使用getfield接口访问表中某个key的值:

lua_getfield

[-0, +1, e]

void lua_getfield (lua_State *L, int index, const char *k);

Pushes onto the stack the value t[k], where t is the value at the given valid index. As in Lua, this function may trigger a metamethod for the "index" event (see §2.8).

遍历表格的方法:

http://blog.csdn.net/chencong112/article/details/6908041

http://www.cnblogs.com/chuanwei-zhang/p/4077247.html

lua_getglobal(L, t);
lua_pushnil(L);
while (lua_next(L, -)) {
/* 此时栈上 - 处为 value, - 处为 key */
lua_pop(L, );
}
lua_getglobal(L, t);
len = lua_objlen(L, -);
for (i = ; i <= len; i++) {
lua_pushinteger(L, i);
lua_gettable(L, -);
/* 此时栈顶即为 t[i] 元素 */
lua_pop(L, );
}

DEMO

描述: 使用c封装了一个lua 接口, 此接口传入一个表, 在C中访问此表中某个key值。

-- temperature conversion table (celsius to farenheit)
require "test" test.printTable({["a"]="aa"})
#include <stdlib.h>
#include <math.h> #define lmathlib_c
#define LUA_LIB #include "lua.h" #include "lauxlib.h"
#include "lualib.h" static int printTable (lua_State *L) {
printf("%s\n", "hello world"); int n = lua_gettop(L); if ( n != )
{
printf("%s\n", "printTable must has one arg");
} if ( lua_istable(L, -) )
{
lua_getfield(L, -, "a");
printf("arg one table[a]=%s\n", lua_tostring (L, -));
}
else
{
printf("%s\n", "printTable arg must be table");
} return ;
} static const luaL_Reg testlib[] = {
{"printTable", printTable},
{NULL, NULL}
}; LUALIB_API int luaopen_test (lua_State *L) {
luaL_register(L, "test", testlib);
return ;
}

打印:

:~/share_windows/openSource/lua/lua-5.1.5$ lua ./test/test.lua
hello world
arg one table[a]=aa

LUA脚本调用C场景,使用C API访问脚本构造的表的更多相关文章

  1. 快速入门Redis调用Lua脚本及使用场景介绍

    Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文 ...

  2. Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween

    在上一篇文章 Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法 中,我对LuaBehaviour脚本进行了扩展,添加了两个新的UI监听方法,也提到最好能单写一个脚本处理此 ...

  3. lua如何调用C++函数

    第一步是定义函数.所有在Lua中被调用的C/C++函数将使用下面一类指针进行调用: typedef int (*lua_CFunction) (lua_State *L); 换句话说,函数必须要以Lu ...

  4. tolua++实现lua层调用c++技术分析

    tolua++技术分析 cocos2dx+lua 前言 一直都使用 cocos2dx + lua 进行游戏开发,用 Lua 开发可以专注于游戏逻辑的实现,另外一方面可以实现热更新:而且 lua 是一个 ...

  5. 深入xLua实现原理之Lua如何调用C#

    xLua是腾讯的一个开源项目,为Unity. .Net. Mono等C#环境增加Lua脚本编程的能力.本文主要是探讨xLua下Lua调用C#的实现原理. Lua与C#数据通信机制 无论是Lua调用C# ...

  6. 原生实现C#和Lua相互调用-Unity3D可用

    引言     本篇简单介绍如何在C#中执行Lua脚本,传递数据到Lua中使用,以及Lua中调用C#导出的方法等.在Unity中开发测试,并打IL2CPP的Android包在模拟器上运行通过.Lua版本 ...

  7. Lua中调用C函数

    Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回 ...

  8. shell脚本调用C语言之字符串切分之strtok函数

    今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...

  9. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

随机推荐

  1. C++11 feature: move constructor

    There are heaps of good articles out there about C++ features including this move constructor. Howev ...

  2. Android Acitivity 生命周期

    Activity的生命周期: (1)启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态. (2)当前Activi ...

  3. git 设置多项目实现多账号登陆

    9:45 2015/11/18git 设置多项目时实现多账号用户登陆git config --global user.name "your_name" git config --g ...

  4. 找到一个Flex中LineChart很好的学习博客

    http://blog.flexexamples.com/category/linechart/ 里面链接复制的时候失效了,请直接点击原页面进行查看 Setting specific minimum ...

  5. 关于加了hibernate 框架的项目启动特别慢的问题

    今天突然遇到一个问题,就是加了hibernate 框架的项目在启动的时候,特别慢,竟然达到了4分多钟,查来查去,看到我的bean类里*.hbm.xml,有这样的写法: <?xml version ...

  6. DBLink创建 ORA-12154: TNS: 无法解析指定的连接标识符

    因为对oracle不了解,这个问题可TM的搞了好久! 走的弯路: 1. 在客服端的PLSQL连接工具上折腾,而不是在服务器的PLSQL解决 2. 配置的tnsnames.org文件在环境变量path( ...

  7. Missing number

    Missing number 题目: Description There is a permutation without two numbers in it, and now you know wh ...

  8. Material Design - CollapsingToolbarLayout

    一.概述 CollapsingToolbarLayout是Material Design的一个Layout,直接继承于FrameLayout. 二.使用 1.导包 2.使用 - 设置相关属性 三.参考 ...

  9. Qt 控件随窗口缩放

    在Qt的界面设计中,我们有时候希望窗口在最大化的时候,上面的控件也跟着缩放,那么我们就需要调整控件的SizePolicy属性,关于这个属性的讲解请参见我之前的博客Qt SizePolicy 属性,由于 ...

  10. jQuery设计思想之取值和赋值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...