如何正确在lua中调用C++的接口

今天群友小狼问我一个问题,是如何使用HTTPRequest的setPOSTData
他在HTTPRequest中查到的接口是这样的:

然后他调用之后报了个错:

其实错误已经说明了,不应该有第三个参数,也就是小狼调用的12这个参数
但是C++的原型的确是声明了两个参数,为啥呢,于是乎我去查了此函数的binding,如下

我们可以看到,在binding中,setPOSTData只接受一个参数,len是通过获取参数一的长度算出来的
所以在lua层调用的时候只能也只需要传第一个参数就好了,不需要传入len!

说到这里,你是不是觉得很坑爹,其实我也有点莫名其妙,为啥要这样省略掉这个参数
廖大或者七月等能否给解释下?

问题解决了,我下面就说说lua层调用C++接口遇到问题时如何找到正确的调用方式;
1.第一种方式是调用的时候提示找不到这个接口,但你查看C++会发现明明有这个接口,那么问题在哪呢?
原因是在做luabinding的时候配置文件中忽略了一些接口,也修改了一些接口在lua层的命名,那么哪里看呢?
所有自动生成的binding文件都在quick根目录的tools/tolua/这个文件夹里,也就是那些ini文件,我们打开cocos2dx.ini
内容我就不贴了,这里需要关注的是这两个部分:
搜索skip = Node,你看到一大堆内容,下面截取一段
skip = Node::,
Sprite::,
SpriteBatchNode::,
MotionStreak::,

是的,就是这里了。
skip后面的内容定义了某个类在导出的时候被忽略的接口,所以当你在lua层找不到一个方法的时候就到这些ini文件里看看是不是没有导出

然后在搜索rename_functions,下面是一小段内容
rename_functions = SpriteFrameCache::,
ProgressTimer::,
AnimationCache::,
rename后面的内容是在导出到lua的时候被重命名的方法,比如上面的addSpriteFramesWithFile在lua中就是addSpriteFrames了

2.第二种情况就是上面小狼遇到的问题,方法有,但是参数跟原接口匹配不上
这种情况下,你就要在去找该接口的binding文件了,你可以全项目搜索该接口的名字,就可以找到他的binding文件
找到binding文件后,查看binding的代码你就能够知道应该如何写参数了。或者也可以去找对应的tolua文件,如果有的话
tolua文件里也是可以查看到的

OVER

赞一个,必须赞一个

:2: :2: 前排顶三刀

三刀牛轰轰 :2:

必须顶~~~~~~~~~~~~~~~~~~~~~:2:

输入的字串有可能带有0值字符,所以在c里必须指定长度,否则用strlen会被截断。但在lua里不存在截断问题,有string肯定就能取到正确的长度,所以可以省掉一个参数。
当然,保持和c一样的接口参数是可以的。不过这个绑定代码是以前继承下来的了,我好象有印象之前c接口也只有一个参数,后面因为有截断的bug才修改成两个参数的,因此lua接口实际上是和以前的接口保持了一致的。