Android 平臺從誕生起,就已經(jīng)支持 C、C++ 開發(fā)。眾所周知,Android 的 SDK 基于 Java 實(shí)現(xiàn),這意味著基于Android SDK 進(jìn)行開發(fā)的第三方應(yīng)用都必須使用 Java 語言。但這并不等同于“第三方應(yīng)用只能使用 Java”。在Android SDK 首次發(fā)布時,Google 就宣稱其虛擬機(jī) Dalvik 支持 JNI 編程方式,也就是第三方應(yīng)用完全可以通過 JNI 調(diào)用自己的 C 動態(tài)庫,即在 Android 平臺上,“Java+C”的編程方式是一直都可以實(shí)現(xiàn)的。
不過,Google 也表示,使用原生 SDK 編程相比 Dalvik 虛擬機(jī)也有一些劣勢,Android SDK 文檔里,找不到任何 JNI 方面的幫助。即使第三方應(yīng)用開發(fā)者使用 JNI 完成了自己的 C 動態(tài)鏈接庫(so)開發(fā),但是 so 如何和應(yīng)用程序一起打包成 apk 并發(fā)布?這里面也存在技術(shù)障礙。比如程序更加復(fù)雜,兼容性難以保障,無法訪問Framework API,Debug 難度更大等。開發(fā)者需要自行斟酌使用。
于是 NDK 就應(yīng)運(yùn)而生了。NDK 全稱是 Native Development Kit。
NDK 的發(fā)布,使“Java+C”的開發(fā)方式終于轉(zhuǎn)正,成為官方支持的開發(fā)方式。NDK 將是 Android 平臺支持 C 開發(fā)的開端。
NDK 提供了一系列的工具,幫助開發(fā)者快速開發(fā) C(或C++)的動態(tài)庫,并能自動將 so 和 java 應(yīng)用一起打包成 apk。這些工具對開發(fā)者的幫助是巨大的。
NDK 集成了交叉編譯器,并提供了相應(yīng)的 mk 文件隔離 CPU、平臺、ABI 等差異,開發(fā)人員只需要簡單修改 mk 文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出 so。
NDK 可以自動地將 so 和 Java 應(yīng)用一起打包,極大地減輕了開發(fā)人員的打包工作。
Google 明確聲明該 API 是穩(wěn)定的,在后續(xù)所有版本中都穩(wěn)定支持當(dāng)前發(fā)布的 API。從該版本的 NDK 中看出,這些 API 支持的功能非常有限,包含有:C 標(biāo)準(zhǔn)庫(libc)、標(biāo)準(zhǔn)數(shù)學(xué)庫(libm)、壓縮庫(libz)、Log 庫(liblog)。