C调Lua函数

转载 2016年05月31日 17:40:38

C 调用 lua 函数

需要考虑的问题:  
1. 使用 lua_pcall 可以调用 lua 函数,首先把 lua 函数入栈,然后把参数入栈, lua_pcall(luaState, 参数个数, 返回值个数, 0) ;  
2. 为了在事件触发时回调 lua 函数,需要把 lua 函数保存起来,使用 luaL_ref(luaState, LUA_REGISTRYINDEX) 将位于栈顶的 lua 函数保存到 LUA_REGISTRYINDEX 表里面, LUA_REGISTRYINDEX 是一个全局表, luaL_ref 将返回 lua 函数在 LUA_REGISTRYINDEX 表中的位置 nRef ;  
3. 使用 lua_rawgeti(luaState, LUA_REGISTRYINDEX, nRef) 获取之前保存的 lua 函数,nRef 是 lua 函数在 LUA_REGISTRYINDEX 表中的位置, lua 函数将被放到栈顶,这时就可以使用 lua_pcall 调用 lua 函数了;  
4. 使用 luaL_unref(luaState, LUA_REGISTRYINDEX, nRef) 可以从 LUA_REGISTRYINDEX 表中删除之前保存的 lua 函数;


示例:  

复制代码
int LuaTest::Attach(lua_State* luaState)
{
    if(lua_isfunction(luaState, 1) != 1)
    {
        return 0;
    }
    lua_settop(luaState, 1);
    m_nRef = luaL_ref(luaState, LUA_REGISTRYINDEX);   // 保存到 LUA_REGISTRYINDEX 表
    lua_pushinteger(luaState, nRef);
    
    return 1;
}

int LuaTest::Detach(lua_State* luaState)
{
    m_nRef = luaL_checknumber(luaState, 1);
    luaL_unref(luaState, LUA_REGISTRYINDEX, nRef);    // 从 LUA_REGISTRYINDEX 表中删除
    m_nRef = 0;
    
    return 0;
}

// 事件监听函数
void LuaTest::EventListener(lua_State* luaState)
{
    lua_rawgeti(luaState, LUA_REGISTRYINDEX, m_nRef);  // 从 LUA_REGISTRYINDEX 表中获取
    lua_pushstring(luaState, "参数1");
    lua_pushstring(luaState, "参数2");
    lua_pcall(luaState, 2, 1, 0);               // 调用 lua 函数
    int nRet = luaL_checknumber(luaState, -1);  // 返回值
}
复制代码

 

lua与C++ / Lua 与C交互

lua   栈  API    一.lua堆栈 要理解lua和c++交互,首先要理解lua堆栈。   简单来说,Lua和C/c++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。 在l...
  • u013321328
  • u013321328
  • 2015年01月15日 11:18
  • 710

简单谈谈lua和c的交互

介绍 lua和c的亲密接触,靠的是一个虚拟栈。lua通过这个虚拟栈来实现和c之间值的互传。栈上的每一个元素是一个lua值(nil,number,string...)。 当lua调用c函数的...
  • u013517637
  • u013517637
  • 2017年01月07日 16:48
  • 347

快速掌握Lua 5.3 —— 从Lua中调用C函数

Q:Lua调用C函数的两种方式? A: 1、程序主体在C中运行,C函数注册到Lua中。C调用Lua,Lua调用C注册的函数,C得到函数的执行结果。 2、程序主体在Lua中运行,C函数作为库函数供Lua...
  • VermillionTear
  • VermillionTear
  • 2016年04月03日 23:09
  • 7807

lua入门之一:c/c++ 调用lua

#include //lua头文件 #ifdef __cplusplus extern "C" { #include "lua.h" #include #include }...
  • x356982611
  • x356982611
  • 2014年05月23日 11:54
  • 15227

c语言与lua交互(capi)介绍, lua调用C语言函数详解(二)

基础: lua与C语言使用“栈”交互数据,“栈”是一种先进后出的机制,“压栈”就是将一个元素放到栈顶,lua_push* 函数就是将不同类型压入到栈中。圧栈的第一个元素编号为1,第二个元素...
  • hello188988
  • hello188988
  • 2015年01月25日 21:03
  • 880

cocos2dx关于在c/c++中调用lua函数

关于在c/c++中调用lua函数
  • u013174689
  • u013174689
  • 2014年12月05日 21:00
  • 1492

c调lua, lua调c

#include #include extern "C" {     #include "lua.h"     #include "lauxlib.h"     #includ...
  • C_singleboy
  • C_singleboy
  • 2014年11月24日 15:51
  • 384

Cocos2d-x3.0下 Lua与C++相互调用

这里讲下Lua与C++之间如何实现相互调用
  • qqMCY
  • qqMCY
  • 2014年05月17日 10:37
  • 3919

C调用Lua -- 简单的解释器程序实现

C调用Lua – 简单的解释器程序实现C调用Lua 简单的解释器程序实现 November 5, 2015 10:57 PM仿照*《Lua程序设计第二版》*ch24中的示例程序,在Lua 5.3.1...
  • im1020110542
  • im1020110542
  • 2015年11月05日 23:00
  • 944

Lua5.1编程四:Lua与C交互基础

1 CAPI Lua与C可以有两种方式进行交互,一种是把LUA的功能作为库进行使用。另一种是在LUA中调用C库的功能,二者都可以通过CPAI的方式在LUA与C之间建立起桥梁。主要的数据结构是一个虚拟...
  • zzulp
  • zzulp
  • 2014年04月10日 15:54
  • 3202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C调Lua函数
举报原因:
原因补充:

(最多只允许输入30个字)