在Android应用框架里,应用层级的软件大多是Java类别,而系统层级的软件大多是C或 C++类别。Android使用JNI接口来达成这个目标。例如,,当它搭配上JNI接口之后,。
图1-1
基于这样的架构,,以便加快程序的执行速度。此外,,,。这是一种非常有用的包装技巧,藉由包装来创造更多的应用机会。
为了进一步创造更多的应用机会,,。如下图所示:
图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幕后的细节架构之二
说明C/C++组件开发
从上图1-4可看到此范例的C/C++组件部份。其详细的程序代码,请阅读高焕堂所写的第2本Android书:<<Android 软件架构设计>> 一书之第5~6章。
说明AIDL接口类别之开发
基于刚才所撰写的相对应Java类别:,就能顺利配上AIDL界面了。
细说AIDL接口与IBinder接口
其实,AIDL接口幕后是仰赖着IBinder界面的。所以,我们的应用程序可以选择使用IBinder接口,也可以使用AIDL接口。如果采取IBinder接口,,其接口类别较单纯一些,如下图所示:
图1-5 仅使用较单纯的IBinder接口
由于IBinder接口只提供单一函数(即transact()函数)来进行远距沟通,呼叫起来比较不方便。例如,当Calculator类别有多个函数时,myActivity要如何呼叫它们呢? 可以呼叫IBinder接口的transact()函数,再转而呼叫Calculator的各个函数。由于它并不太方便,所以Android提供Proxy/Stub结构的AIDL接口来化解这个问题,其架构图如下:
图1-6 更方便的AIDL接口(其接口类别结构较复杂一些)
在本范例里,将采取AIDL接口,同时也介绍其幕后的IBinder接口,以及其两这之间的密切关系。
细说Stub类别的程序代码
;。:
/*---- ----*/
/*
* This file is auto-generated. DO NOT MODIFY.
* Original file:
*/
.;
import ;
import ;
import ;
import ;
import ;
import ;
public interface calInterface extends
19深刻解析Android的AIDL界面 来自淘豆网www.taodocs.com转载请标明出处.