http://hi.baidu.com/wangyu8702/blog/item/a124b1997f5c4c136e068c1d.html


在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. Android(安卓)BMI程式
  2. 深刻解析 Android(安卓)的 AIDL
  3. Android框架的深度分析1
  4. Android(安卓)Sip学习(四)Android自带SipDemo详解
  5. Google 推出 Android(安卓)Design 網站,教您如何設計 Android(安
  6. android 命令珍藏
  7. android 命令大全
  8. android 命令大全
  9. android 命令大全

随机推荐

  1. 态路小课堂丨QSFP-DD封装模式光模块接口
  2. 前端inline元素间隙问题解决办法
  3. 游戏云间之五:游戏架构
  4. MyBatis的SQL执行流程,逻辑超清晰,总结得也
  5. TaskBuilder低代码开发平台怎么样?
  6. Linux常用命令的超全整理(附Linux学习笔记
  7. MySql基本查询-基本函数
  8. Elasticsearch的基础语法
  9. 用 Python 制作一个迷宫游戏
  10. python实现Hangman游戏