Cocos2d-JS跨平台的调用方法
首先从我们ProjectM的开发背景开始,项目采用的Cocos2d-JS 引擎是为了发布到包括Web平台,iOS,Android,Mac,Windows等全平台。理论上只需修改少量代码就可打包为原生性能表现的混合游戏,支持全平台的同时也保证性能需求。
接下来就通过在ProjectM项目接入终端统一登录库的方法来看一下终端平台不同语言之间调用。
Android终端平台
虽然使用JS开发在Web端验证之后在终端平台功能基本一致,但是终端设备上的登录模块是统一接入第三方SDK,必须针对不同平台单独接入。一般情况下第三方为了一次开发支持多个平台,业务逻辑使用C++开放,在封装成不同平台库提供接入。接下来就是接入第三方SDK库时涉及到的各种平台的调用方式。
1.1 从JS层调用到Java层
在用户点击登录按钮的时候,JS层响应点击事件然后通过系统平台的判断调用反射方法。
使用cocos2d-js 3.0以上版本中的一个新特性,在android平台上可以通过反射直接在js中调用java的静态方法:
if (cc.sys.OS_ANDROID == cc.sys.os) {
console.log("current platform is: cc.sys.OS_ANDROID");
jsb.reflection.callStaticMethod("org/cocos2dx/javascript/AppActivity", "requestLogin", "(Ljava/lang/String;)V", strPlatform);
return true;
}
在jsb.reflection.callStaticMethod方法中,需要传入对应Java的类名、方法名和参数返回值类型以及参数名称。对应的AppActivity类中的方法实现如下
public static void requestLogin(final String strPlatform) {
IMLogger.d("requestLogin platform = " + strPlatform);
Bundle bundleMsg = new Bundle();
bundleMsg.putString("key", strPlatform);
// send message
Message message = s_handler.obtainMessage();
message.what = HANDLER_LOGIN_REQ;
message.setData(bundleMsg);
s_handler.sendMessage(message);
}
通过消息机制来处理请求,立即让callStaticMethod返回。如果在此处需要有UI层的界面显示,需要启用UI线程来操作
AppActivity.this.runOnUiThread(new Runnable() {
......
}
因为在android平台,cocos的渲染和JS的逻辑是在GL线程中进行的,而android本身的UI更新是在app的UI线程进行的。
1.2 从Java层到C++层
上面提到了从JS层调用到Java层方法之后&