在看到本文之前,如果讀者沒看過筆者的前文 獲取Android源碼捻悯,初識源碼模塊架構(gòu)简逮,請先翻閱。
JNI: Java Native Interface
用于和本地其他已編譯的語言進(jìn)行交互强缘,包括但不僅限于C和C++
JNI的主要代碼在 frameworks/base/core/jni
在Windows系統(tǒng)上,一般可執(zhí)行的應(yīng)用程序都是基于Native(本地)的PE結(jié)構(gòu)不傅,Windows上的 JVM 也是基于 Native 結(jié)構(gòu)實現(xiàn)的旅掂,Java 應(yīng)用體系都是構(gòu)建于 JVM 之上。
由此可得Windows系統(tǒng)上的Java體系:
Windows:native method访娶,c/c++辞友、dll/com,JVM
JVM:jre/jdk震肮、jni、Java
Java:applications留拾、modules
即 Java 是 JVM 的子集戳晌,JVM 又是 Windows 的子集。
在Android系統(tǒng)中痴柔,C和C++的實現(xiàn)屬于系統(tǒng)底層沦偎,JNI接口屬于中間層,Java實現(xiàn)屬于頂層應(yīng)用,JNI的調(diào)用關(guān)系為:Java->JNI->Native(C/C++ SO庫)
和 JNI 密切相關(guān)的是 Media 系統(tǒng)豪嚎,而 Media 系統(tǒng)的架構(gòu)基礎(chǔ)是 MediaScanner搔驼,其目錄為 packages/providers/MediaProvider
我們打開目錄下的 AndroidManifest.xml,如下圖所示
我們重點關(guān)注其中的
MediaProvier侈询、MediaScannerReceiver舌涨、MediaScannerService
MediaProvider:是一個ContentProvider,媒體庫(Images/Audio/Video/Playlist等)的數(shù)據(jù)提供者扔字。負(fù)責(zé)操作數(shù)據(jù)庫囊嘉,并提供給其他的程序 insert、query革为、delete扭粱、update 等操作。
MediaScannerReceiver:是一個BroadcastReceiver震檩,功能是進(jìn)行媒體掃描琢蛤,提供給外界的接口之一,收到廣播之后啟動 MediaScannerService 執(zhí)行掃描工作抛虏。
MediaScannerService:是一個Service博其,負(fù)責(zé)媒體掃描,和Framework的 MediaScanner共同完成掃描工作嘉蕾,掃描結(jié)果存放在 MediaProvider 提供的數(shù)據(jù)庫中贺奠。
MediaScanner系統(tǒng)的 JNI 調(diào)用關(guān)系:
MediaScanner------libmedia_jni.so------libmedia.so
MediaScanner 的 Java 層實現(xiàn)源碼在
frameworks/base/media/java/android/media/MediaScanner.java
就其主要實現(xiàn)進(jìn)行概括:
【1】加載JNI庫 System.loadLibray("media_jni"); native_init();
【2】實現(xiàn)掃描工作 scanDirections()方法
【3】讀取并保存信息 prescan()方法
【4】刪除不存在于SD卡中的文件信息 postscan()方法
【5】直接轉(zhuǎn)向JNI 本地方法processDirectory()
【6】掃描文件函數(shù) doScanFile()
【7】異常處理 在jni.h中定義了主要的異常函數(shù)