《Android的设计与实现:卷I》——第2章 框架基础JNI
第2章 框架基礎(chǔ)JNI
JNI(Java Native Interface,Java本地接口)是Java平臺(tái)上定義的一套標(biāo)準(zhǔn)的本地編程接口。JNI允許Java代碼與本地代碼互操作,即Java代碼可以調(diào)用本地代碼,本地代碼也可以調(diào)用Java代碼。所謂本地代碼指的是用其他編程語(yǔ)言(如C/C++)實(shí)現(xiàn)的、依賴于特定硬件和操作系統(tǒng)的代碼。通過(guò)JNI調(diào)用本地代碼,可以實(shí)現(xiàn)Java語(yǔ)言所不能實(shí)現(xiàn)的功能。在Android平臺(tái)上,Dalvik虛擬機(jī)會(huì)實(shí)現(xiàn)JNI定義的接口。
2.1 JNI在Android系統(tǒng)中所處的位置
Android采用分層的體系結(jié)構(gòu):上層的應(yīng)用層和應(yīng)用框架層主要使用Java語(yǔ)言開(kāi)發(fā);下層則運(yùn)行一個(gè)Linux內(nèi)核,并在內(nèi)核之上集成了各種核心庫(kù)和第三方庫(kù),以提供系統(tǒng)運(yùn)行所需的服務(wù),這部分是用C和C++語(yǔ)言開(kāi)發(fā)。連接這兩部分的紐帶就是JNI。
JNI在Android系統(tǒng)中所處的位置如圖2-1所示。
從圖2-1中可以看出,JNI可以直接調(diào)用本地代碼庫(kù),并可以通過(guò)Dalvik虛擬機(jī)實(shí)現(xiàn)與應(yīng)用層和應(yīng)用框架層之間的交互。Android JNI部分的代碼主要位于Android體系結(jié)構(gòu)中的上面兩層:
應(yīng)用層:采用NDK開(kāi)發(fā),主要使用標(biāo)準(zhǔn)JNI編程模型實(shí)現(xiàn)。
應(yīng)用框架層:Android定義了一套JNI編程模型,使用函數(shù)注冊(cè)方式彌補(bǔ)了標(biāo)準(zhǔn)JNI編程模型的不足。
Android應(yīng)用框架層JNI部分源碼主要位于frameworks/base/目錄下。按照模塊組織,不同的模塊將被編譯為不同的共享庫(kù),分別為上層提供不同的服務(wù)。這些共享庫(kù)最終會(huì)被放置在目標(biāo)系統(tǒng)的/system/lib目錄下。
注意 NDK與JNI的區(qū)別: NDK是為便于開(kāi)發(fā)基于JNI的應(yīng)用而提供的一套開(kāi)發(fā)和編譯工具集;而JNI則是一套編程接口,可以運(yùn)用在應(yīng)用層,也可以運(yùn)用在應(yīng)用框架層,以實(shí)現(xiàn)Java代碼與本地代碼的互操作。
JNI編程模型的結(jié)構(gòu)十分清晰,可以概括為以下三個(gè)步驟:
步驟1 Java層聲明Native方法。
步驟2 JNI層實(shí)現(xiàn)Java層聲明的Native方法,在JNI層可以調(diào)用底層庫(kù)或者回調(diào)Java層方法。這部分將被編譯為動(dòng)態(tài)庫(kù)(SO文件)供系統(tǒng)加載。
步驟3 加載JNI層代碼編譯后生成的共享庫(kù)。
JNI的很多概念比較模糊,為了不引起歧義,這里規(guī)定本書中的涉及名詞的含義。
native:特指Java語(yǔ)言中的方法修飾符native。
Native方法:特指Java層中聲明的、用native修飾的方法。
JNI層:特指采用JNI技術(shù)實(shí)現(xiàn)Java層聲明的Native方法的部分。
JNI函數(shù):特指JNIEnv提供的函數(shù)。
JNI方法:特指Native方法對(duì)應(yīng)的JNI層實(shí)現(xiàn)方法。
了解了JNI的主要概念和基本結(jié)構(gòu),下一節(jié)將以一個(gè)實(shí)例詳細(xì)分析JNI編程的三個(gè)步驟。
總結(jié)
以上是生活随笔為你收集整理的《Android的设计与实现:卷I》——第2章 框架基础JNI的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pwnable input2 之 wri
- 下一篇: Java工程师成神之路 转