- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
19深刻解析Android的AIDL界面.doc
19.深刻解析Android的AIDL界面
Android应用框架里,应用层级的软件大多是Java类别,而系统层级的软件大多是C或 C++类别。Android使用JNI接口来达成这个目标。例如,在Android里有个MediaPlayer.cpp类别,当它搭配上JNI接口之后,在VM上执行的MediaPlayer.java就可以透过JNI接口与MediaPlayer.cpp类别沟通了。
图1-1
基于这样的架构,我门就可以尽量将MediaPlayer.java里的程序逻辑移入MediaPlayer.cpp类别里,以便加快程序的执行速度。此外,以JNI接口包装MediaPlayer.cpp类别,并且衔接相互辉映的MediaPlayer.java类别,可以让众多的Java应用程序透过MediaPlayer.java来使用MediaPlayer.cpp类别的服务。这是一种非常有用的包装技巧,藉由包装来创造更多的应用机会。
为了进一步创造更多的应用机会,可以替MediaPlayer.java类别加上AIDL接口,让更多的Java应用程序能与MediaPlayer.java类别进行远距的IPC沟通。如下图所示:
图1-2
上图表示出JNI在Android里扮演的角色,以及Android框架里Java与C/C++类别融合的基本架构。上面的图1-2是一个较为抽象的图,凸显JNI与AIDL的相互呼应之角色。
于此,以高焕堂所写的第2本Android书:Android 软件架构设计 一书里的范例:HalfAdder组件为例,展示其幕后的细节架构。首先看看其JNI界面之上的细节架构,如下UML图:
图1-3 上图1-2幕后的细节架构之一
上图凸显了AIDL界面的细节架构。下图1-4将换个角度,从*.so开发者来看,当我们开发系统层级的C/C++类别时,也能善用JNI,创造C/C++类别的广大商机。其细节架构如下UML图:
?
?
图1-4 上图1-2幕后的细节架构之二
1.3 说明C/C++组件开发
从上图1-4可看到此范例的C/C++组件部份。其详细的程序代码,请阅读高焕堂所写的第2本Android书:Android 软件架构设计 一书之第5~6章。
1.4 说明AIDL接口类别之开发
基于刚才所撰写的相对应Java类别:Calculator.java,就能顺利配上AIDL界面了。
1.4.1 细说AIDL接口与IBinder接口
其实,AIDL接口幕后是仰赖着IBinder界面的。所以,我们的应用程序可以选择使用IBinder接口,也可以使用AIDL接口。如果采取IBinder接口,就不必使用aidl.exe工具去产出calInterface.java接口定义文件了,其接口类别较单纯一些,如下图所示:
?
?
图1-5 仅使用较单纯的IBinder接口
由于IBinder接口只提供单一函数(即transact()函数)来进行远距沟通,呼叫起来比较不方便。例如,当Calculator类别有多个函数时,myActivity要如何呼叫它们呢? 可以呼叫IBinder接口的transact()函数,再转而呼叫Calculator的各个函数。由于它并不太方便,所以Android提供Proxy/Stub结构的AIDL接口来化解这个问题,其架构图如下:
?
?
图1-6 更方便的AIDL接口(其接口类别结构较复杂一些)
在本范例里,将采取AIDL接口,同时也介绍其幕后的IBinder接口,以及其两这之间的密切关系。
1.4.2 细说Stub类别的程序代码
这个Stub类别就是由aidl.exe所产出的;也就是在calInterface.java里面。兹再重复列出calInterface.java程序代码如下:
/*---- calInterface.java ----*/
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: calInterface.aidl
*/
package com.misoo.gx06;
import java.lang.String;
import android.os.RemoteException;
import android.os.IBinder;
import android.os.IInterface;
import android.os.Binder;
import android.os.Parcel;
public interface calInterface extend
您可能关注的文档
最近下载
- 第四届全国工业设计职业技能大赛(无损检测员赛项)选拔赛考试题库(含答案).docx VIP
- 结缔组织病相关的间质性肺疾病诊断和治疗.pptx VIP
- 部编语文六年级上册第八单元整体教学设计教案.docx VIP
- 2024届高考作文素材- 敦煌.docx VIP
- 学年山东省济南市天桥区数学五年级上册第一学期期末考试真题(人教版,含答案).docx VIP
- 05G511 梯形钢屋架图集标准.docx
- ARM Cortex-M 系列:ARM Cortex-M7 系列_(4).Cortex-M7的指令集.docx
- 全驱动灵巧手的电气系统设计及控制方法研究.pdf
- 眼肿瘤 ppt课件(最新文档).ppt VIP
- 天然气企业LNG储配站交接班记录式样.pdf VIP
文档评论(0)