先看一张流程图如下:
第一步:
先把NDKHelper中的方法转成LUA中可以调用的,转得方法可参考quick中LUA的用法。这个类主要是中间桥梁的作用,它可以根据是什么平台调用IOSNDKHelper或者AndroidSNDKHelper,这些判断都是用C语言来写的。还有就是对一些回调函数的保存机制和平台要用LUA中一些方法的保存。
第二步:
IOS平台需要处理的就是IOSNDKHelper,这个类主要就是接收和发送给NDKHelper数据的方法,还有一个就是加载IOS平台的BasePlatformHelper类和继承该类的子类。最后写不同SDK需要用到的方法,这个方法都是在 BasePlatformHelper的子类中写。这些方法是和LUA中对应的。完成后在初始化的时候把它和它的父类通过IOSNDKHelper加载到内存当中。
第三步:
Android的处理方式和ios差不多,按照ios的思想写就可以。其中Android中需要AndroidSNDKHelper类,它的作用也就是接收和发送函数、参数到到NDKHelper中,还有就是加载Android中平台要用的方法到内存中。
第四部:
流程如下
在LUA中调用sendMessageToNative方法时传入需要调用的方法和参数以及回调函数,在该方法中如果有回调函数的话,就把回调函数保存到内存当中,然后在调用C语言中得方法判断是IOS还是Android平台,如果是IOS平台的则就会调用IOSNDKHelper中的RecieveCPPMessage方法,RecieveCPPMessage这个方法会根据你传入的方法名和参数调用在平台上定义的方法。该方法执行完以后如果不需要返给调用者数据的话,这个流程就完成了,如果需要返给调用着数据的话,就把要反的数据和函数名通IOSNDKHelper类中 SendMessage方法传回去。在SendMessage方法中会把你传入的参数做处理然后在调用NDKHelper类中得HandleMessage方法,在HandleMessage中会根据你传入的方法名在内存中查找之前你传入的回调函数句柄,然后用参数和函数句柄根据LUA的处理方式调用LUA中对应的方法。Android的和ios的调用类似。
以上就是LUA中调用平台的方法流程。
平台把调用LUA中的方法时就是把调用的方法和参数通过 IOSNDKHelper和AndroidSNDKHelper 传给NDKHelper,NDKHelper通过处理后调用LUA 方法。
以上就是个人的一点理解,有理解错误的地方希望大牛给予指点。
cocos2d-x 中LUA和平台之间的函数调用理解,布布扣,bubuko.com