1. Lua调用C++的函数
Lua要调用C++的函数还是蛮方便的,首先,我们来创建一个c++函数先:
- public:
- static int getNumber(int num);
- int HelloLua::getNumber( int num ) {
- CCLOG("getNumber num = %d", num);
- return num + 1;
- }
类的什么的,我就忽略了,直接上函数。
这是一个很简单的函数,给出一个值,返回一个+1后的值。
现在,我们想在Lua中调用这个函数,得多写一个函数。
- public:
- static int cpp_GetNumber(lua_State* pL);
- int HelloLua::cpp_GetNumber( lua_State* pL ) {
- /* 从栈顶中取一个值 */
- int num = (int)lua_tonumber(pL, 1);
- /* 调用getNumber函数,将返回值入栈 */
- lua_pushnumber(pL, getNumber(num));
- /* 返回值个数,getNumber只有一个返回值,所以返回1 */
- return 1;
- }
这是怎么回事呢?我们很清楚,Lua和C++只能通过堆栈通信,所以Lua是不可能直接调用getNumber函数的,所以我们建立一个cpp_GetNumber函数作为中介。
cpp_GetNumber函数有一个lua_State* pL参数,有了这个参数,c++就能从Lua的堆栈中取值了,剩下的都很简单,不想过多的解释...
还是解释一下吧。
1) 首先,Lua脚本里会调用cpp_GetNumber函数,至于为什么能调用,一回解释,我知道旁白一定会问的。(旁白:有种无力吐槽的感觉。。。)
2) 当cpp_GetNumber被调用时,一切又回到C++对Lua的操作了,栈顶里会存放函数所需要的参数,取出来用就可以的。
3) Lua调用cpp_GetNumber之后,需要一个结果,当然,这个结果同样只能存放在栈里,所以理所当然地要把getNumber的结果入栈。
4) 最后,cpp_GetNumber return了一个值,这个值不是函数的执行结果,而是getNumber需要返回值的个数(Lua支持多个返回值的函数)
旁白,你明白了么?
好,既然大家都明白了,我就不多说了~