美文网首页
Android ShareSDK桥接技术

Android ShareSDK桥接技术

作者: 皮皮酱ye | 来源:发表于2018-06-14 10:43 被阅读0次

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详细代码可以参考:

相关文章

  • Android ShareSDK桥接技术

    ShareSDK本身基于android原生上集成使用的,但是为了能让广大开发者可以在各种引擎上使用ShareSDK...

  • iOS ShareSDK桥接技术

    前言 在游戏开发中,难免会出现与原生平台有交互才能完成一些特定的必要的功能。比如iOS的内购功能,或者你想用一款第...

  • 在App中集成ShareSDK

    ShareSDK目前提供3.0+版本的集成功能,Android ShareSDK3.x集成 集成ShareSDK的...

  • Android 桥接模式

    Android 23种设计模式 一、前言 Android桥接(Bridge)模式,又被称为桥梁模式。结构型模式之一...

  • ADB命令使用手册

    概述 Adb作为PC和Android设备交互与通信的工具 Android调试桥接,Android DebugBri...

  • Toll-free bridging

    字面意思是“免费桥接技术”,桥接的是Core Foundation框架和 Foundation框架之间的数据。 通...

  • 超实用的adb与adb shell常用命令汇总

    adb(Android Debug Bridge),SDK自带的工具,可实现桥接功能,实现PC和android设备...

  • MobTech shareSDK 微信分享失效

    之前Android app 用shareSDK 集成的微信分享,最近突然就失效了。最后查看是ShareSDK.ge...

  • 接SHARESDK注意的

    微信分享回调,在导出后需要在java文件下新建wxapi文件夹,创建WXEntryActivity,把shares...

  • ADB指令

    adb:Android 调试桥接 Android Debug Bridge,是一个 C/S 架构的命令行工具 a...

网友评论

      本文标题:Android ShareSDK桥接技术

      本文链接:https://www.haomeiwen.com/subject/nsieeftx.html