分类: LINUX
2009-06-15 13:09:03
圖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書:<
圖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書:<
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介面,以及其兩這之間的密切關係。