【走进Lua的世界之六】Lua调用C++函数

来源:互联网 发布:php框架怎么用 编辑:程序博客网 时间:2024/05/01 19:21

这篇文章,我们将来介绍Lua何如调用C++的函数。

我们来创建一个C++函数,新建一个类,命名为HelloLua,头文件的代码如下:

class HelloLua:pulibc CCLayer{   CREATE_FUNC(HelloLua);   virtual bool init();   static CCScene* scene();   static int getNumber(int num);};

getNumber函数的具体实现如下:

int HelloLua::getNumber(int num){   CCLOG("getNumber num=%d",num);   return num + 1;}

现在,我们想在lua中调用这个函数,得再给HelloLua添加一个函数,代码如下:

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返回了一个值,这个值不是函数的执行结果,而是getNumber需要返回值的个数(lua支持多个返回值的函数)。

(5)lua会从栈中取出函数的执行结果。


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

bool HelloLua::init(){   lua_State* pL=lua_open();   luaopen_base(pL);   /* C++的函数和封装函数都必须是静态的 */   lua_register(pL,"cpp_GetNumber",cpp_GetNumber);   luaL_dofile(pL,"helloLua.lua");   lua_close(pL);   return true;}

最后还要修改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对象的,因此,注册的函数必须是静态的。

0 0
原创粉丝点击