【走进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
- 【走进Lua的世界之六】Lua调用C++函数
- 【走进Lua的世界之五】C++调用Lua函数
- Lua编程(六)C对Lua函数的调用
- 【走进Lua的世界之一】初识Lua
- [lua]C调用lua函数
- 【走进Lua的世界之二】实战解析Lua和C++的通信
- 【走进Lua的世界之三】lua的堆栈到底为何物?
- 【走进Lua的世界之四】再进一步,获取lua表结构的数据
- Lua调用C函数
- lua 调用c函数
- Lua调用C函数
- lua调用c函数
- Lua调用C函数
- lua调用C函数
- lua调用C函数
- lua调用C函数
- Lua调用C函数
- lua调用c函数
- 下载谷歌浏览器(Chrome)扩展crx文件最简单的方法~
- EasyUI网上资源(WebUI)
- 二维码、条形码扫描—ZXing
- Mysql中文乱码问题完美解决方案
- LeetCode|Search a 2D Matrix
- 【走进Lua的世界之六】Lua调用C++函数
- 嵌入式的一些学习建议
- Socket深入剖析
- 在我的Ubuntu上移植SQLite3.3.6,编译成静态库
- 深入浅出之正则表达式(一)
- 模拟Delta-Sigma的差分原理做的PWM C51程序
- 如何安装 Tomcat 于 Windows、Mac、Ubuntu 三大系统中
- 线性结构的顺序存储的实现
- 深入Java单例模式2