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

最近一直在忙着改前端的东西,固然也遇到了一些问题,因此记录一下前端

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版)》的最后几章的内容来学习。</br>         书归正传,在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接口时,再额外传递一个真是长度参数便可解决这个需求了。python

相关文章
相关标签/搜索