在代码身上,用心去飞翔

你是我的小啊小code,怎么爱你都不嫌多

C调Lua函数

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
个人分类: Lua
上一篇Lua中WriteFile和ReadFile
下一篇Cocosd2d-js 判断字符串包含
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭