Lua篇(第06章):Lua调用C++的函数

来源:互联网 发布:网络与新媒体专业 编辑:程序博客网 时间:2024/06/16 07:17


 

到这为止,大家对LuaC++之间的通信应该有些熟悉了,今天我们来介绍最后一个操作。

(旁白:什么?最后一个?要结束了么?太好了~!)

 


正文:

 

1. Lua调用C++的函数

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

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  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中调用这个函数,得多写一个函数。

(旁白:那个,为嘛getNumber函数是静态的?)

 

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  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支持多个返回值的函数)

旁白,你明白了么?

(旁白:额。。。没明白)

 

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

(旁白:你妹纸的O O!)


 ------------------------------------------- 来自2014.10.15的补充 begin-------------------------

十分抱歉,万分抱歉!我漏了很重要的内容,那就是lua中如何调用c++的函数的?

今天看到有人评论,然后今晚再次看了一下,才发现,真的漏了!


补充如下:


现在,要开始使用这两个函数了,修改HelloLua的init函数:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <pre code_snippet_id="403406" snippet_file_name="blog_20141015_3_3789756" name="code" class="cpp">bool HelloLua::init() {  
  2.     lua_State* pL = lua_open();  
  3.     luaopen_base(pL);  
  4.   
  5.     /* C++的函数和封装函数都必须是静态的,不知道可不可以不是静态的?当然不可以 */  
  6.     lua_register(pL, "cpp_GetNumber", cpp_GetNumber);  
  7.     luaL_dofile(pL, "helloLua.lua");  
  8.     lua_close(pL);  
  9.     return true;  
  10. }</pre>  

最后还要修改helloLua.lua脚本文件:

-- helloLua.lua文件

local num = cpp_GetNumber(10);


用调试模式运行项目,我们将看到以下日志输出:

getNumber num = 10


代表getNumber函数被调用了,换句话说,cpp_GetNumber被成功调用了。


现在来解释最重要的一点,为什么在Lua里能够调用cpp_GetNumber函数,Lua可以通过lua_register将C++的静态函数注册到Lua中,这样Lua就可以直接调用C++的函数。

至于为什么cpp_GetNumber函数为什么非得是静态的,很简单,如果不是静态函数,就必须在对象被创建之后才能调用。在Lua中是不能也不会去再次创建一个HelloLua对象的(当然,在Lua中还是能够创建C++对象的,这个暂时不讨论),因此,注册的函数必须是静态的。

 --------------------------------------- 来自2014.10.15的补充 end-------------------------


2. 结束了

最后,关于Lua的教程,到此告一段落了,本来我还想写写LuaBind的教程的(非常强大!)。但是,写教程是一件很耗时的工作,10分钟能学会的知识,也许我要花2个小时才能诞生一篇教程。(旁白:好吧,所以大家多些支持他吧。。。)

 

不过,如果大家把这6篇教程吃透,然后再去用LuaCocos2d-x里开发,就没什么大的难度了。(最好再去了解一下LuaBind

或许,我以后会接着写Lua的教程,而现在,我要继续学习Cocos2d-x去了~因为写教程的缘故(这两周一直在写状态机的教程以及Lua的教程),我停止了接近两周的时间。得抓紧了~不能落后~

那么,祝大家元旦快乐。

(旁白:你确定你元旦之后会发这篇教程么?)

 

然后,希望大家轻轻地动一下鼠标,点一下“顶”~嘿嘿

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 严重脱发怎么办去问南宁肤康 脱发严重怎么办去看南宁肤康 前额头发少怎么办 如何使头发增多 生完宝宝头发一把一把的掉怎么办 生完宝宝后头发掉的厉害怎么办 生完宝宝头发掉的厉害怎么办 生了小孩后头发掉很多怎么办 生了孩子头发掉的很厉害怎么办 母乳期头发掉的很厉害怎么办 宝宝吃母乳头发掉的厉害怎么办 头发油腻头皮屑多还掉头发怎么办 头发剪了中分刘海弯了怎么办 头发掉了长出来的头发很细怎么办? 头皮损伤毛囊怎么办还会长头发吗 一岁宝宝头发稀少怎么办能刮光头么 前编头发长了怎么办怎么梳理 九个月宝宝头发稀少不长怎么办 前牙吃饭咬合很深吃饭就痛怎么办 吃了甜的冷的就牙疼怎么办 吃热的凉的甜的牙疼怎么办 头发太细了想让头发变粗点怎么办 我的头发又少又很油该怎么办 头发油掉发头顶头发稀疏怎么办 我的头发天生就少又细怎么办 头发越来越少怎么办 用什么好呢 头发油掉头发怎么办吃什么药好 生完孩子三个月掉头发很厉害怎么办 电夹板夹头发现在掉头发怎么办 刚剪完的头发前面短后面长怎么办 头发太多太厚怎么办_百度经验 米诺地尔搽剂喷在头皮上痛怎么办 米诺地尔擦了头皮痒怎么办 头发又细又少一天不洗就油怎么办 头又尖头发又细又少不知怎么办 蘑菇头发型留长尴尬期怎么办 月经期间洗了下头量很少了怎么办 宝宝喝了有沐浴露的洗澡水怎么办 4个月宝宝头发长的慢怎么办 宝宝不小心吃了自己拉的屎怎么办 手机不小心弄成耳机模式怎么办 苹果手机不小心按了丢失模式怎么办