鍍金池/ 教程/ Java/ Android NDK 簡介
Android NDK 開發(fā)環(huán)境
Android NDK 簡介
JNI 字符串處理
JVM 查找 native 方法的規(guī)則
JNI 開發(fā)流程
JNI 局部引用、全局引用和弱全局引用
JNI 數(shù)據(jù)類型與 Java 數(shù)據(jù)類型的映射關(guān)系
JNI 概述
JNI 調(diào)用性能測試及優(yōu)化
C/C++ 訪問 Java 實(shí)例變量和靜態(tài)變量
JNI 調(diào)用構(gòu)造方法和父類實(shí)例方法
C/C++ 訪問 Java 實(shí)例方法和靜態(tài)方法
開發(fā)自己的 NDK 程序
JNI 訪問數(shù)組

Android NDK 簡介

NDK 產(chǎn)生的背景

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

  • 代碼的保護(hù)。由于 apk 的 java 層代碼很容易被反編譯,而 C/C++ 庫反匯難度較大。
  • 可以方便地使用現(xiàn)存的開源庫。大部分現(xiàn)存的開源庫都是用 C/C++ 代碼編寫的。
  • 提高程序的執(zhí)行效率。將要求高性能的應(yīng)用邏輯使用 C 開發(fā),從而提高應(yīng)用程序的執(zhí)行效率。
  • 便于移植。用 C/C++ 寫得庫可以方便在其他的嵌入式平臺上再次使用。

NDK 簡介

NDK 是一系列工具的集合

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ā)人員的打包工作。

NDK 提供了一份穩(wěn)定、功能有限的 API 頭文件聲明

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)。