您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x中使用tolua++导出函数中传递字节流给lua使用的问题

2014-05-17 12:08 543 查看
最近一直在忙着改前端的东西,当然也遇到了一些问题,所以记录一下


cocos2d-x中使用tolua++导出函数中传递字节流给lua使用的问题

在cocos2dx 3.0 中提供了新的c/c++函数导出到lua使用的工具,貌似是基于python改的。在对于cocos2dx 2.x的项目中,还是使用的tolua++来作为导出的辅助工具。顺便介绍一下tolua++吧,熟悉lua的开发者都知道,当需要暴露一个函数或者类型亦或者接口给lua使用时,要编写一些桥接函数,按照lua capi定义的风格编写,然后再注册到luastate里。但程序员都是一帮能偷懒就偷懒的人,于是就有人想到通过做工具来完成这些事情。于是就诞生了tolua++、luabind等项目。tolua++是个很长时间没有更新过的项目了,网上能搜到的例子不多,直到最近cocos2d-x中使用了它来作为桥接c/c++到lua的工具才又引起了关注。所以,如果一个对lua不熟悉的人一上来就用tolua++的话会觉得很头昏,所以建议在用tolua++之前,最好先搞清楚不借助工具的情况下,简单的导出c/c++函数给lua的桥接函数该怎么写, 这个可以参考《LUA程序设计(第2版)》的最后几章的内容来学习。

书归正传,在tolua++提供的一些c函数中,并没有提供对应于lua capi的pushlstring的接口,所以这个时候要传递一个字节流给lua的时候就有点翻嘀咕了,如果我传递的一个字节流里带有了'\0',那么在tolua生成的桥接函数里,会使用了pushstring来传递该参数给lua的栈, 那么这个字节流会被截断么?带着这个疑惑,在网上搜了下,又翻阅了一遍LUA程序设计(第2版)》,发现里面有句话大概写的意思是说:“在lua的string是可以内部允许出现'\0'的,当指定未指定长度时,会使用strlen来获取”,这下我傻眼了,那么如果使用pushstring的话,按照书里的这个解释,那么strlen势必会截断中间含有'\0'的字符串啊。后来网上也有人在cocos2dx的论坛上给提建议说,在toluafix_xxxx的函数中增加对pushlstring的支持。但是这还是没法解决想要传递可能含有'\0'字节流的char* 给lua的问题,后来再三搜索,无意中看到了lua里pushstring函数的实现代码,确实,pushstring的调用相当于是pushlstring的调用并且在长度参数传递了NULL, 而pushlstring里获取长度也是确实使用了strlen,但是,注意但是! 它的strlen并不是标准库的strlen, 而是自己实现的strlen, 所以也就是说, 其实传递的时候是不会被截断的!只是需要注意的是,当lua要是给c++传递的时候,c++是没办法获取真实长度的,所以在设计api接口时,再额外传递一个真是长度参数即可解决这个需求了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: