Cocos2d-x 浅谈Lua与C++函数间互相调用问题
来源:互联网 发布:linux 如何删除php 编辑:程序博客网 时间:2024/06/06 10:58
原创文章,欢迎转载,转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列]
博客地址:http://blog.csdn.net/qq446569365
使用LUA开发游戏的时候,LUA与C++函数之间的互相调用是必然遇到的问题。虽说LUA运行效率已经是脚本语言中“最快”的了。但是其在运行复杂算法和多线程运算的能力上,比C++差的太远了。所以LUA与C++之间互相调用是非常常见的。那么,如何将自己写的C++程序绑定进LUA中呢?
注:这个只是一些小函数的绑定方法,如果是将C++的类绑定进入LUA中可以采用tolua++,对于这个工具的使用我会在下一篇帖子再进行详细介绍,这里就不赘述了。
首先是将C++函数绑定进LUA,也就是从LUA中调用C++的函数
- static int httpSend(lua_State*L)
- {
- const char * url = lua_tostring(L, 1);
- return 0;
- }<span style="font-size:18px;"><span style="font-family:Arial;color:#333333;"><span style="line-height: 26px;">
- </span></span></span>
然后AppDelegate::applicationDidFinishLaunching()函数中加入
lua_register(L, "APhttpSendMethod", httpSend);
这个是将C++函数注册到LUA虚拟机中,然后在lua中可以通过APhttpSendMethod("123")调用C++的方法了
- bool AppDelegate::applicationDidFinishLaunching()
- {
- auto engine = LuaEngine::getInstance();
- ScriptEngineManager::getInstance()->setScriptEngine(engine);
- lua_State* L = engine->getLuaStack()->getLuaState();
- lua_module_register(L);
- lua_register(L, "APhttpSendMethod", httpSend);//这句
- if (engine->executeScriptFile("src/main.lua")) {
- return false;
- }
- return true;
- }
const char * url = lua_tostring(L, 1);
所有数据类型都可以通过类似于lua_tostring的方式来读取,第二个参数可以简单的理解成第几个参数。
关于这块儿的知识更多详细内容可以查看Lua程序设计一书,讲解的十分清楚,我就不露怯了!
其次,返回值return 0 是表示,C++函数会返回几个返回值给lua 通过lua_pushstring来像lua返回返回值。
下面是C++调用LUA的函数,首先有一点需要说明,C++调用lua函数,会重新载入一次lua函数所在的文件!
- void httpReceive()
- {
- lua_State* ls = cocos2d::LuaEngine::getInstance()->getLuaStack()->getLuaState();//获取lua虚拟机
- std::string scriptPath=cocos2d::FileUtils::getInstance()->fullPathForFilename("httpCallback.lua");//载入lua函数所在文件
- int isOpen = luaL_dofile(ls, scriptPath.c_str());//打开文件
- if (isOpen != 0){
- CCLOG("AppDelegate httpReceive --> Open Lua Error: %i", isOpen);
- return ;
- }
- lua_getglobal(ls, "httpCallback");//获取lua的函数 也就是要调用的函数
- lua_call(ls, 0, 0);//执行!俩参数分别是你给lua函数传入了几个函数,lua函数将返回几个函数。
- }<span style="font-size:18px;">
- </span>
function httpCallBack()
end
就可以了
- Cocos2d-x 浅谈Lua与C++函数间互相调用问题
- [寒江孤叶丶的Cocos2d-x之旅_25]Cocos2d-x 浅谈Lua与C++函数间互相调用问题
- cocos2d-x中lua与C++,C语言互相调用
- Cocos2d C++与lua互相调用
- cocos2d-x 3.x中lua调用原理1--从基本的c++与lua互相调用开始
- C/C++与Lua互相调用
- lua与c语言互相调用
- lua与C的互相调用
- Lua 脚本语言 与 C的互相调用
- cocos2d-x下c++调用lua函数
- cocos2d-x lua调用c++函数
- cocos2d-x bindings-generator(lua调用c++)
- cocos2d-x bindings-generator(lua调用c++)
- objective-c与cocos2d-x的互相调用实现获取麦克风音量大小
- 【Cocos2d-x lua篇005】C++调用Lua的函数
- 【Cocos2d-x lua篇006】Lua调用C++的函数
- cocos2d-x 与 lua
- cocos2d-x 3.0 在C++中调用lua函数
- ca证书demo与相关问题
- [MySQL FAQ]系列 — MySQL无法启动例一
- Redis学习4之redis单节点常用指令总结
- Fragment Toast空指针NullPointerException
- java.lang.NoClassDefFoundError: com.cv.faceapi.CvFaceApiBridge
- Cocos2d-x 浅谈Lua与C++函数间互相调用问题
- ios设置字体-黑体,加粗等
- Knockout应用开发指南 第六章:加载或保存JSON数据
- SpringMVC深度探险(二) —— SpringMVC概览
- 在Ubuntu 12.04 中安装和设置 Samba 实现网上邻居共享
- Androdi Dialog 设置宽度与屏幕宽度一样
- FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(
- 交换两个数不使用第三方变量=!!=深入理解按位异或运算符
- 开发手记9.11