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