今天继续沿着JSB的底层文件开始研究。
里面出现了一个CCMBProgressHUD,是一个等待旋转的UI部件,开源项目,被归在SDK/other目录下;还有CCOPENUDID,也是一个开源项目,引入一个每台机器专属的ID。
研究的主体sendMessageToast底层也是一个开源项目,在iOS下模拟android提示的iToast。
调用这个结构就到OC层了。这里复习一下OC的知识,成员函数以+开头的表示不用创建类的实例就可调用,普通的成员函数以-开头。
[[[[iToast makeText:NSLocalizedString([NSString stringWithUTF8String:message],@"")] setGravity:iToastGravityBottom] setDuration:iToastDurationNormal] show];
这句涉及的知识点:NSLocalizeString为本地化,将传入的参数转为对应的本地语言;makeText是不需要声明实例就可调用的,生成的对象再调用setGravity,返回的对象继续调用setDuation设置参数,最后返回的对象执行show。
重制计划里我删掉了很多原项目中引用的外部SDK,所以产生了不少问题。发现项目修改了引擎的CCFileUtils文件里的getFileData函数,把从硬盘读取文件数据的机制改为从自加密的pak和json文件中读取,这个机制应该是为内更新设计的。
这里面涉及了JsonReader,FileMgr几个外部SDK,大致逻辑是先获取文件在SD卡中的路径,如果路径存在,就从指定路径读取文件,不存在的话,就从默认路径读取。
注释掉PAK读取文件机制后程序可以运行了。
然后提示找不到对应方法,问题在调用方式上,绑定脚本会生成一个绑定类,里面有getInstance方法,还需要在项目入口调用JSB引擎时注册接口,这里是
register_all_configbinding,里面生成一个wrapperConfig类,然后调用其中的Config.getInstance()方法就能生成实例从而调用绑定好的接口。
到这里项目的第一次JSB绑定就结束啦。
这个接口经历了
CSystemInfoMgr(OC) -> JNI(封装接口)->config(c++)-> configbindings(JSB绑定)-> wrapperFunction(封装调用的接口 JS) ->实际调用(JS)
流程一旦调通了,后续的绑定开发就会比较顺利了。
现在开始做UI吧~