ShareSDK本身基于android原生上集成使用的,但是为了能让广大开发者可以在各种引擎上使用ShareSDK,ShareSDK采用了跨语言的桥接技术,使得ShareSDK可以在游戏和网页引擎上使用,本票文章主要介绍下三种桥接技术的核心要点。
我们知道,两种语言交互,相互调用、传参,接收执行结果等等动作,不外乎在于两个api,(1)主动去调用其它语言的某个方法;(2)接收方法执行的结果两种情况;方法执行的结果,主要又分成两种情况:一种是同步回调;一种是异步回调(也就是需要等待结果回来)。同步回调,也就是我们我们常用的return;异步回调,也就是平时所谓的各种监听,比如异步请求回调结果监听,或者常用的各种listener。比如使用A语言去调用B语言,通信结构图如下:

OK,看到这个图是不是觉得非常简单,这些引擎,可能有些用户觉得这样是不是很麻烦,其实这些都有现成的api可以调用,现在来每个具体讲解下:
[if !supportLists]一、 [endif]Unity For ShareSDK:
ShareSDK脚本开发语言主要是使用C#,直接步入正题,Unity是有一个java的支持包,叫做classes.jar,一般是在Unity安装的目录:
Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes下面,这个就是Unity和Android交互的核心包,也是Unity提供的桥接部分,这部分支持启动时候的逻辑处理和java往C#层传递数据;里面总共没几个类,做过Unity的开发者如果反编译过游戏的apk,就会知道,启动(launch Activity)activity肯定是UnityPlayerActivity,如果需要在启动的时候执行什么初始化操作,可以重新继承UnityPlayerActivity,然后在AndroidManifest.xml下面去注册,这样Unity就会使用你自己写的这个启动类。接下来直接上代码,看下Unity里面是如何调用java的:在C#层,Unity同样提供了一套调用android的api,其中有一个类AndroidJavaObject

首先要找到需要调用的类,然后传当前挂载脚本的那个物体(Gameobject),此处可以理解成相当于物体和代码绑定初始化的一个过程,最后一个是回调的方法名字(此处使用的callback),得到的实例后,可以通过Call和CallStatic方法去调用非静态方法和静态方法,如果方法是带返回值的,则可以使用类似Call、CallStatic去调用;


上面创建AndroidJavaObject的时候传的callback,java层回调给C#的时候需要把这个Gameobject,Callback方法名字和传参发送回来,C#就会去找对应的方法去执行;
Java回调,

C#接收回调的方法:

具体详细代码可以参考:
https://github.com/MobClub/New-Unity-For-ShareSDK
[if !supportLists]二、 [endif]Cocos For ShareSDK
Cocos引擎和Unity的使用非常相似,同样是有一个Cocos提供的Android依赖库,在Cocos框架的安装目录下,大致目录如下:\cocos\platform\android\java\,下面有一个基于ant项目结构的Android Library,现在普遍使用Android Studio,
所以开发者可以自己新建一个AS Module,把src下面的源码复制到src>main>java下面就好。然后cocos项目依赖它。同样,它也有一个启动Activity,Cocos2dxActivity,Cocos-Android项目的启动activity需要继承于它,在里面做一些初始化操作。Cocos和java交互,其实就是用到了native层的jni语法,先通过JniHelper::getStaticMethodInfo传递类路径+名字,方法名字和传的参数,判断这个静态方法是否存在,返回一个bool类型,同样,非静态方法则使用getMethodInfo,


对于jni的字段描述符,网上有很多,可以参考,下面这个表

取自:http://fgsink.blog.163.com/blog/static/16716997020124310169911/
如果这个方法存在,正式去调用:通过CallStaticVoidMethod或者CallVoidMethod,

JniMethodInfo对象的引用,函数执行中会把jniEvn、classid、methodid写入到引用中,如果方法是带返回值的,则可以这样调用带数据类型的方法:

接下来再看下C++层封装给java的回调方法调用语法

JNICALL Java
_包名类名路径_方法名,如果包名有分层,每一层的点用下横杠表示”_”;C++层定义的回调方法,在java层需要这样定义

通过回调包里面的方法去调用,使之在GLThread执行

因为Cocos是基于OpenGL平台,Android下与它交互需要使用一个GLSurefaceView,然而GLSurefaceView有它自己的渲染器,这个渲染器是运行在一个和AndroidUI线程的子线程上,所以需要使用GLThread,这样就可以把数据抛回去给C++层;
详细代码可以参考:
https://github.com/MobClub/New-C2DX-For-ShareSDK
[if !supportLists]三、 [endif]JS For ShareSDK
JS和Android交互,大部分的开发者应该都有用过,网上也有很多,所以这边粗略讲一下就好。交互的基础其实是限制于Android原生的WebView上使用。整个核心其实就是用到了JSInterface方法加上@JavascriptInterface注解,优化兼容问题,webview有个JSInterface方法,可以让js直接调用java,先向js层声明这么一个接口,定义一个String,

JS调用的时候使用window.JSInterface.方法名,就可以调用到java层的方法

同时在回调的时候给回callback参数,可以识别到JS的回调方法,进而去触发它:

拼接时注意传递的格式以及参数

此时和Unity、Cocos不同的一个地方,JS的return也是通过封装好回调参数后,使用异步的方式抛回去的,


网友评论