進去正題前,我們先來看下JVM的工作原理,或者說Java代碼的執(zhí)行步驟,如下圖:

Java源文件(.java文件)是如何一步步執(zhí)行的,如上圖所示,首先Java源文件經(jīng)過Java編譯器(javac或ECJ)將.java文件編譯為Java字節(jié)碼文件,然后JRE加載Java字節(jié)碼文件,載入系統(tǒng)分配給JVM的內(nèi)存區(qū),然后執(zhí)行引擎解釋或編譯類文件,再由即時編譯器將字節(jié)碼轉(zhuǎn)化為機器碼。從而達到在機器上能夠運行。
JNI(Java Native Interface)是 java 與 C/C++ 進行通信的一種技術(shù)。眾所周知,Java語言是跨平臺的語言,而這跨平臺的背后都是依靠Java虛擬機,虛擬機采用C/C++編寫,適配各個系統(tǒng),通過JNI為上層Java提供各種服務(wù),保證跨平臺性。Android 中的 Framework 層與 Native 層就是采用的JNI技術(shù)。
我們知道, Android 系統(tǒng)是基于 Linux開發(fā),采用的是 Linu x內(nèi)核。 Android APP 開發(fā)大部分也要和系統(tǒng)打交道,只是 Android FrameWork 幫我們處理了和系統(tǒng)相關(guān)的操作。我們從Android 系統(tǒng)的分成結(jié)構(gòu)可以看出,Android FrameWork 是通過JNI與底層的C/C++庫交互,例如:FreeType,OpenGL,SQLite,音視頻……

如果程序需要調(diào)用自己的C/C++函數(shù)庫,就必須用到JNI/NDK開發(fā)。
Java代碼調(diào)用C代碼

C代碼調(diào)用Java代碼
