C调用lua函数需要考虑的问题 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    这篇文章主要介绍了C调用lua函数需要考虑的问题,本文罗列了4条需要注意的问题,并给出了调用实例,需要的朋友可以参考下

    需要考虑的问题:

    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); // 返回值

    }

最新文章