Android學習之(一):從零開始學Android

        Android--個人認爲是Google的神舉之一。打從誕生之初,就以爆炸的形似蔓延全球。直至今日,仍是手機終端系統、移動設備的主導者。而且還不斷的發展......

     其人性化的操作方式,清晰的體系結構讓無論是使用者還是開發者都覺得很容易入手。目前各類app不斷被開發,功能不斷豐富,有大舉趕上甚至超越PC應用的趨勢。還是來看看Android長什麼樣。(附上經典圖)


Android操作系統總體框架如圖所示,主要包括:

(1)應用程序層(Application)——各種APK和組件


(2)應用程序框架層(Application Framework)——Java編寫,實現Android的系統框架和GUI,應用開發的平臺,主要包括:

Activity ManagerActivityAndroid應用程序中最小執行單元。Activity Manager管理每個Activity的生命期及相關行爲。

Window ManagerAndroid的應用程序包含有很多WindowsWindow Manager用於管理Windows

Content Provider:支持各應用之間共享數據


(3)LibrariesAndroid Runtim層——採用C/C++語言編寫,主要爲上層GUI和系統服務(Application Framework )提供一些底層實現。Runtime是Android運行時環境。提供了核心鏈接庫(Core Libraries)和Dalvik VM虛擬系統。採用Java開發的應用編譯成apk後交給Android操作系統來執行。開發者用Java編寫app時,先是生成了源代碼(.Java),編譯—>(.class),再編譯—>Dalvik VM執行的文件(.dex),包裝—>Android可執行的文件(.apk)。


(4)Linux內核層——Linux內核提供系統核心服務,如進程、內存、電源管理,網絡連接,驅動與安全等。也是硬件和其他軟件程序代碼之間的抽象層。


    Java和C/C++能調用銜接很關鍵的一種技術就是JNI。

        Android上層的ApplicationApplication Framework都是使用Java編寫,底層包括系統和使用衆多的Libraries都是C/C++編寫的。所以上層Java要調用底層的C/C++函數庫必須通過JavaJNI來實現。

       從Java1.1開始,Java Native Interface(JNI)標準成爲java平臺的一部分,它允許Java代碼和其他語言寫的代碼進行交互。

使用JNI的核心是JNINaiveMethod結構體,這個結構是jni.h中定義如下:

Typedef struct {

  Const char* name;           // JNI函數的名稱

  Const char* signature;      // 描述JNI函數的參數和返回值

  Void* fnptr;                //JNI函數對應的C語言的函數指針

} JNINATIVEMETHOD;

JNINaiveMethod第一個參數是字符串,JNI函數的名稱,對應於JAVA中使用的方法名稱;第二個參數也是字符串,表示參數和返回值的類型;第三個參數是JNI函數對應的C語言的函數指針。

       Java通過java JNI調用本地方法,而本地方法是以共享庫(*.so)文件的形式存放的,通過調用本地庫文件的內部方法,使java可以實現和本地機器的緊密聯繫,調用系統級的各接口方法。在java語言中,用native關鍵字聲明的方法就是java調用的本地方法,例如:public  native  void hello() ; //java調用本地方法hello

Jni對於應用本身來說,可以看做一個代理模式。對於開發者來說,需要使用c/c++來實現一個代理程序(jni程序)來實際操作目標原生函數,java程序中則是jvm通過加載並調用此jni程序來間接地調用目標原生函數。

                                                     

                                                                            Jni調用過程示意圖

需要注意的是,利用C/C++完成的底層代碼的安全性較弱,無法防止開發者利用無效的指針來改寫內存,這樣會導致虛擬機安全性削弱。使用java與本地已編譯的代碼交互,通常會喪失平臺可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的。例如,使用一些舊的庫,與硬件、操作系統進行交互,或者爲了提高程序的性能。JNI標準至少保證本地代碼能工作在任何Java 虛擬機下實現。




   





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章