Android ShareSDK桥接技术

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也是通过封装好回调参数后,使用异步的方式抛回去的,


https://github.com/MobClub/New-JS-For-ShareSDK详细代码可以参考:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,032评论 25 707
  • 01 惊醒 翠花被磨刀声惊醒,微暗的灯光下从门缝看过去,公公在磨刀,热腾腾的水汽弥散在房间里,自己的丈夫跪在地上低...
    花落谁心阅读 350评论 4 2
  • 花子五岁的时候有了一个弟弟,父亲取名字为胜一。 一直被父亲讨厌的花子第一次真正有了危机感,她在不经意的时候看到,父...
    顶天王子阅读 2,763评论 0 1