【Cocos2d-x lua篇006】Lua调用C++的函数

来源:互联网 发布:ubuntu启动anaconda 编辑:程序博客网 时间:2024/05/25 23:58

1. Lua调用C++的函数

Lua要调用C++的函数还是蛮方便的,首先,我们来创建一个c++函数先:

[cpp] view plaincopyprint?
  1. public:  
  2.   static int getNumber(int num);  
  3.     
  4.     
  5. int HelloLua::getNumber( int num ) {  
  6.     CCLOG("getNumber num = %d", num);  
  7.     return num + 1;  
  8. }  

类的什么的,我就忽略了,直接上函数。


 

这是一个很简单的函数,给出一个值,返回一个+1后的值。

现在,我们想在Lua中调用这个函数,得多写一个函数。


 

[cpp] view plaincopyprint?
  1. public:  
  2. static int cpp_GetNumber(lua_State* pL);  
  3.   
  4.   
  5. int HelloLua::cpp_GetNumber( lua_State* pL ) {  
  6.     /* 从栈顶中取一个值 */  
  7.     int num = (int)lua_tonumber(pL, 1);  
  8.   
  9.     /* 调用getNumber函数,将返回值入栈 */  
  10.     lua_pushnumber(pL, getNumber(num));  
  11.   
  12.     /* 返回值个数,getNumber只有一个返回值,所以返回1 */  
  13.     return 1;  
  14. }  


 


这是怎么回事呢?我们很清楚,LuaC++只能通过堆栈通信,所以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支持多个返回值的函数)

旁白,你明白了么?


 

好,既然大家都明白了,我就不多说了~


 


原创粉丝点击