AndroidNDK是能使Android應用開發者把從c/c++編譯而來的本地代碼嵌入到應用包中的一系列工具的組合。
注意:
AndroidNDK只能用於Android1.5及以上版本中。
I. Android NDK 目標:
Android虛擬機允許你的應用在源碼中通過JNI調用本地代碼中實現的方法們。概括起來,這表示:
-你的應用的源中要聲明一個或多個方法,這些方法前面需有'native'關鍵字,這表明它們被本地代碼實現。如:
nativebyte[] loadFile(String filePath);
-你必須提供本地的共享庫,庫中包含這些方法的實現。這個庫將會打包你的應用.apk中。這個庫的命名必須符合標准的Unix命名規則,也就是:lib<something>.so這種形式。並且還要包含一個標准的JNI入口。例如:
libFileLoader.so
-你的應用必須顯式的加載本地庫。例如,要在應用啟動時加載,只需簡單地在代碼中增加如下語句:
static{
System.loadLibrary("FileLoader");
}
注意寫庫的名字時你不需要使用'lib'前綴和'.so'後綴。
AndroidNDK只是AndroidSDK的一個組件,它幫助你:
-產生JNI兼容的共享庫,此庫能運行於跑在ARMCPU上的Android1.5及以上系統。
-把共享庫考貝到你的應用的項目中的合適的位置,並最終把它們添加到你的.apks中。
-在後續的NDK版本中,我們打算提供通過遠程gdb調試本地代碼的工具並盡量多地提供源碼和符號信息。
AndroidNDK還提供了:
-一系列跨平台的編譯工具(編譯器,鏈接器,等等),它們可以在Linux,OS X 和 Windows (使用Cygwin)上產生ARM上的二進制程序碼。
-一系列的頭文件,對應於Android系統所支持的穩定的本地API們,這保證了你所用的接口在後續所有版本中依舊被支持。
重點注意:
記住大多數系統庫並沒有固定死並且可能在未來的版本中會發生重大變化,甚至被刪除,但是”穩定的API們”是不變的。
-一個構建系統,使得開發者只需寫少量編譯文件描述哪些源文件需被構建即可。構建系統可處理所有編譯工具鏈/平台/CPU/ABI細節。還有,後續的NDK更新中可以在添加更多的編譯工具鏈,平台,系統接口的同時不需開發者的項目構建文件發生變化。
II.Android NDK 不想做的:
使用NDK編寫運行於android設備上的一般本地代碼這種方式並不好。你的應用依然應該使用Java編寫,正確處理Android系統的事件來避免"應用無反應"對話框的出現或處理應用的生命周期。
注意,無論如何還是可以通過本地代碼編寫精巧的應用的,這個應用上只是帶有一個很小的用於啟動/關閉應用的包裝。
對JNI的深刻理解是非常必要的。因為在這個環境中的很多操作需要開發者做出一些特殊的處理,而它們在典型的一般代碼(java)中是不需要的。這些包括:
-不能通過指針直接使用VM對象的內容。例如,你無法安全地獲取一個指向java字符串對象的16位字符數組的指針然後在一個循環中枚舉它的每一項。
-當本地代碼想要在不同的JNI調用之間保存VM對象的句柄時,需要對句柄進行明確的引用管理。
NDK僅僅為被android系統支持的本地API和庫中很少的一些提供了頭文件。然而一個典型的Android系統映像包含了很多本地共享庫,但這些應被看做是實現的細節,這些實現可能在平台更新或發布時產生徹底的變化。
如果一個Android系統的庫沒有被NDK的頭文件明確支持,那麼應用不應依賴於它。否則可能在下一次系統升級後出現杯具。
選中的系統庫將逐漸地被添加到穩定版的NDKAPI中。