分層方式當中,Native層就是本地框架。
這些層大致如此區分:
Java應用程式無需過多解釋,基本可以理解為各個App,由Java語言實現。Java框架層就是常說的Framework,這層裡東西很多也很複雜,比如說主要的一些系統服務如ActivityManagerService、PackageManagerService等,
編寫Android程式碼之所以能夠正常識別和動作,都要依賴這一層的支援。這一層也是由Java語言實現。
Native層這部分常見一些本地服務和一些連結庫等。這一層的一個特點就是透過C和C++語言實現。比如我們現在要執行一個複雜運算,如果透過java程式碼去實現,那麼效率會非常低,此時可以選擇透過C或C++程式碼去實現,然後和上層的Java程式碼通訊(這部分在android中稱為jni機制)。
又比如我們的裝置需要執行,那麼必然要和底層的硬體驅動互動,也要透過Native層。Linux核心空間這部分顧名思義,就是Kernel部分。
擴充套件資料:
一個native method方法可以返回任何java型別,包括非基本型別,而且同樣可以進行異常控制。這些方法的實現體可以制一個異常並且將其丟擲,這一點與java的方法非常相似。當一個native method接收到一些非基本型別時如Object或一個整型陣列時,
這個方法可以訪問這些非基本型的內部,但是這將使這個native方法依賴於你所訪問的java類的實現。有一點要牢牢記住:我們可以在一個native method的本地實現中訪問所有的java特性,但是這要依賴於你所訪問的java特性的實現,而且這樣做遠遠不如在java語言中使用那些特性方便和容易。
native method的存在並不會對其他類呼叫這些本地方法產生任何影響,實際上呼叫這些方法的其他類甚至不知道它所呼叫的是一個本地方法。JVM將控制呼叫本地方法的所有細節。需要注意當我們將一個本地方法宣告為final的情況。
用java實現的方法體在被編譯時可能會因為內聯而產生效率上的提升。但是一個native final方法是否也能獲得這樣的好處卻是值得懷疑的,但是這只是一個程式碼最佳化方面的問題,對功能實現沒有影響。
如果一個含有本地方法的類被繼承,子類會繼承這個本地方法並且可以用java語言重寫這個方法(這個似乎看起來有些奇怪),同樣的如果一個本地方法被final標識,它被繼承後不能被重寫。
本地方法非常有用,因為它有效地擴充了JVM。事實上,我們所寫的Java程式碼已經用到了本地方法,在Sun的Java的併發(多執行緒)的機制實現中,許多與作業系統的接觸點都用到了本地方法,這使得java程式能夠超越Java執行時的界限。有了本地方法,Java程式可以做任何應用層次的任務。
分層方式當中,Native層就是本地框架。
這些層大致如此區分:
Java應用程式無需過多解釋,基本可以理解為各個App,由Java語言實現。Java框架層就是常說的Framework,這層裡東西很多也很複雜,比如說主要的一些系統服務如ActivityManagerService、PackageManagerService等,
編寫Android程式碼之所以能夠正常識別和動作,都要依賴這一層的支援。這一層也是由Java語言實現。
Native層這部分常見一些本地服務和一些連結庫等。這一層的一個特點就是透過C和C++語言實現。比如我們現在要執行一個複雜運算,如果透過java程式碼去實現,那麼效率會非常低,此時可以選擇透過C或C++程式碼去實現,然後和上層的Java程式碼通訊(這部分在android中稱為jni機制)。
又比如我們的裝置需要執行,那麼必然要和底層的硬體驅動互動,也要透過Native層。Linux核心空間這部分顧名思義,就是Kernel部分。
擴充套件資料:
一個native method方法可以返回任何java型別,包括非基本型別,而且同樣可以進行異常控制。這些方法的實現體可以制一個異常並且將其丟擲,這一點與java的方法非常相似。當一個native method接收到一些非基本型別時如Object或一個整型陣列時,
這個方法可以訪問這些非基本型的內部,但是這將使這個native方法依賴於你所訪問的java類的實現。有一點要牢牢記住:我們可以在一個native method的本地實現中訪問所有的java特性,但是這要依賴於你所訪問的java特性的實現,而且這樣做遠遠不如在java語言中使用那些特性方便和容易。
native method的存在並不會對其他類呼叫這些本地方法產生任何影響,實際上呼叫這些方法的其他類甚至不知道它所呼叫的是一個本地方法。JVM將控制呼叫本地方法的所有細節。需要注意當我們將一個本地方法宣告為final的情況。
用java實現的方法體在被編譯時可能會因為內聯而產生效率上的提升。但是一個native final方法是否也能獲得這樣的好處卻是值得懷疑的,但是這只是一個程式碼最佳化方面的問題,對功能實現沒有影響。
如果一個含有本地方法的類被繼承,子類會繼承這個本地方法並且可以用java語言重寫這個方法(這個似乎看起來有些奇怪),同樣的如果一個本地方法被final標識,它被繼承後不能被重寫。
本地方法非常有用,因為它有效地擴充了JVM。事實上,我們所寫的Java程式碼已經用到了本地方法,在Sun的Java的併發(多執行緒)的機制實現中,許多與作業系統的接觸點都用到了本地方法,這使得java程式能夠超越Java執行時的界限。有了本地方法,Java程式可以做任何應用層次的任務。