ShareSDK桥接技术

ShareSDK本身基于android原生上集成使用的,但是为了能让广大开发者可以在各种引擎上使用ShareSDK,ShareSDK采用了跨语言的桥接技术,使得ShareSDK可以在游戏和网页引擎上使用,本票文章主要介绍下三种桥接技术的核心要点。

我们知道,两种语言交互,相互调用、传参,接收执行结果等等动作,不外乎在于两个api1主动去调用其它语言的某个方法;(2)接收方法执行的结果两种情况;方法执行的结果,主要又分成两种情况:一种是同步回调;一种是异步回调(也就是需要等待结果回来)。同步回调,也就是我们我们常用的return;异步回调,也就是平时所谓的各种监听,比如异步请求回调结果监听,或者常用的各种listener。比如使用A语言去调用B语言,通信结构图如下:

  

OK,看到这个图是不是觉得非常简单,这些引擎,可能有些用户觉得这样是不是很麻烦,其实这些都有现成的api可以调用,现在来每个具体讲解下:

一、 Unity For ShareSDK:

ShareSDK脚本开发语言主要是使用C#,直接步入正题,Unity是有一个java的支持包,叫做classes.jar,一般是在Unity安装的目录:

Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes 下面,这个就是UnityAndroid交互的核心包,也是Unity提供的桥接部分,这部分支持启动时候的逻辑处理和javaC#层传递数据;里面总共没几个类,做过Unity的开发者如果反编译过游戏的apk,就会知道,启动(launch Activityactivity肯定是UnityPlayerActivity,如果需要在启动的时候执行什么初始化操作,可以重新继承UnityPlayerActivity,然后在AndroidManifest.xml下面去注册,这样Unity就会使用你自己写的这个启动类。接下来直接上代码,看下Unity里面是如何调用java的:在C#层,Unity同样提供了一套调用androidapi,其中有一个类AndroidJavaObject

 

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

 

 

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

Java回调,

 

 C#接收回调的方法:

 

具体详细代码可以参考:

https://github.com/MobClub/New-Unity-For-ShareSDK

 

二、 Cocos For ShareSDK

Cocos引擎和Unity的使用非常相似,同样是有一个Cocos提供的Android依赖库,在Cocos框架的安装目录下,大致目录如下:\cocos\platform\android\java\,下面有一个基于ant项目结构的Android Library,现在普遍使用Android Studio,

所以开发者可以自己新建一个AS Module,把src下面的源码复制到src>main>java下面就好。然后cocos项目依赖它。同样,它也有一个启动ActivityCocos2dxActivityCocos-Android项目的启动activity需要继承于它,在里面做一些初始化操作。Cocosjava交互,其实就是用到了native层的jni语法,先通过JniHelper::getStaticMethodInfo传递类路径+名字,方法名字和传的参数,判断这个静态方法是否存在,返回一个bool类型,同样,非静态方法则使用getMethodInfo

 

 

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

 

取自:http://fgsink.blog.163.com/blog/static/16716997020124310169911/

如果这个方法存在,正式去调用:通过CallStaticVoidMethod或者CallVoidMethod

 

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

 

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

 

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


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

 

因为Cocos是基于OpenGL平台,Android下与它交互需要使用一个GLSurefaceView,然而GLSurefaceView有它自己的渲染器,这个渲染器是运行在一个和AndroidUI线程的子线程上,所以需要使用GLThread,这样就可以把数据抛回去给C++层;

详细代码可以参考:

https://github.com/MobClub/New-C2DX-For-ShareSDK

三、 JS For ShareSDK

JSAndroid交互,大部分的开发者应该都有用过,网上也有很多,所以这边粗略讲一下就好。交互的基础其实是限制于Android原生的WebView上使用。整个核心其实就是用到了JSInterface方法加上@JavascriptInterface注解,优化兼容问题,webview有个JSInterface方法,可以让js直接调用java,先向js层声明这么一个接口,定义一个String

 

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

 

 

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

 

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

 

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

 


详细代码可以参考:

https://github.com/MobClub/New-JS-For-ShareSDK

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 2 3 4 5 $sharesdk.shareContent($sharesdk.platformID.SinaWeibo, params, function (platform, state, shareInfo, error) { alert("state = " + state + "\nshareInfo = " + shareInfo + "\nerror = " + error); }); 一键分享 1 2 3 4 5 $sharesdk.oneKeyShareContent([$sharesdk.platformID.SinaWeibo, $sharesdk.platformID.TencentWeibo], params, function (platform, state, shareInfo, error) { alert("state = " + state + "\nshareInfo = " + shareInfo + "\nerror = " + error); }); 关于具体的分享参数名称,请参考“不同平台分享内容的详细说明”章节的说明。 用户授权 调用ShareSDK中的authorize方法可进行用户授权。代码如下: 1 2 3 4 5 $sharesdk.authorize($sharesdk.platformID.SinaWeibo, function (platform, state, error){ alert("state = " + state + "\nerror = " + error); }); 获取用户资料 调用ShareSDK中的getUserInfo来获取授权用户的信息。代码如下: 1 2 3 4 5 $sharesdk.getUserInfo($sharesdk.platformID.SinaWeibo, function (platform, state, user, error) { alert("state = " + state + "\nuser = " + user + "\nerror = " + error); }); iOS部分集成步骤(不发布iOS版本可略过此部分) 导入JS桥接的iOS版本组件 打开下载的JS包里的iOS/ShareSDKForJS/ShareSDKForJS.xcodeproj项目工程,选择ShareSDKForJS静态库运行Xcode,如图: 700px-js_doc_001.png 运行成功之后,请大家打开文件找到Build文件夹,然后进入文件中找到build/Products/Debug-iphonesimulato /libShareSDKForJS.a文件以及找到build/Products/Debug-iphonesimulator/usr/local /include/ShareSDKJSBridge.h这个文件,再将libShareSDKForJS.a和ShareSDKJSBridge.h这 2个文件导入到你的项目里,如图 700px-js_doc_002.png 注意:(如果在分享中弹不出分享的菜单,如果大家的ShareSDK.js文件是本地的,要把这个加到Build Phases里面的Copy Bundle Resources选项) 下载iOS版本ShareSDK,并导入到工程中。 登录ShareSDK的官方网站下载并解压最新版本的SDK。如果您还尚未下载,请 点击这里下载 或者访问 http://sharesdk.cn/Download 。解压后如图所示: 700px-js_doc_003 将ShareSDK导入工程中,并添加相应的依赖库。此步骤可以参考:《iOS快速集成指南》中的第一、第二步。执行完成后,如下图所示: 700px-js_doc_004.png 为UIWebView添加消息捕获 先导入ShareSDKJSBridge.h头文件。 1 #import "ShareSDKJSBridge.h" 然后给UIWebView设置一个委托对象,如: 1 webView.delegate = self; 注意:webView是UIWebView的对象实例。 最后实现shouldStartLoadWithRequest委托方法,并在方法中加入JSBridge的captureRequest方法,代码如下: 1 2 3 4 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { return ![[ShareSDKJSBridge sharedBridge] captureRequest:request webView:webView]; } 添加完毕后就可以对工程进行运行测试。 Android部分集成步骤(不发布Android版本可略过此部分) 导入的步骤如下: 1、参考”安卓快速集成文档“章节的说明,导入ShareSDK for Android的jar库和图片、文字资源。 2、复制github上的jsdemo项目中”cn.sharesdk.js”包中的源代码复制到你的项目中。QQ截图20150304142013 3、在您WebView加载页面地址之前。调用ShareSDKUtils.prepare(webview, webviewClient); 请注意,ShareSDKUtils.prepare方法要在WebView.setWebViewClient(WebViewClinet);之后调用,而且此后不能再调用setWebViewClient方法,否则ShareSDK的初始化操作可能失败。 下面的代码来自github上的demo: Objective-C 1 2 3 4 5 6 7 8 9 10 11 12 public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WebView wvBody = new WebView(this); WebViewClient wvClient = new WebViewClient(); wvBody.setWebViewClient(wvClient); wvBody.setWebChromeClient(new WebChromeClient() { public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } });

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值