java native interface(java本地接口)
ABI: application binary interface (應用程序二進制接口)java
JNI是Java語言提供的Java和C/C++相互溝通的機制,Java能夠經過JNI調用本地的C/C++代碼,本地的C/C++的代碼也能夠調用java代碼。JNI 是本地編程接口,Java和C/C++互相經過的接口。Java經過C/C++使用本地的代碼的一個關鍵性緣由在於C/C++代碼的高效性。android
NDK是一系列工具的集合。它提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一塊兒打包成apk。這些工具對開發者的幫助是巨大的。它集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平臺、ABI等差別,開發人員只須要簡單修改mk文件(指出「哪些文件須要編譯」、「編譯特性要求」等),就能夠建立出so。它能夠自動地將so和Java應用一塊兒打包,極大地減輕了開發人員的打包工做。c++
#爲何要使用JNI程序員
#怎麼使用JNI算法
dev-cpp.exe 編程
Java經過JNI機制和C/C++溝通的具體步驟微信
實際執行Java代碼去和本地的C/C++代碼互相溝通app
在標準的Java平臺下,每一個Process裏能夠產生不少JavaVM對象,每一個JavaVM對象都有一個與之對應的JavaVM對象,可是在Android平臺上,每一個Process只能產生一個DalvikVM對象,也就是說在一個Android的進程中是經過有且只有一個虛擬器對象來服務全部Java和C++代碼的。jvm
當java須要C/C++代碼時,在DalvikVM虛擬機中加載動態連接庫時,會先調用JNI_Onload()函數,此時就會把javaVM對象的指針存儲於C層JNI組建的全局環境中,在JAVA層調用C層的本地庫函數時,調用C本地函數線程必然經過Dalvik VM來調用C本地函數,測試Dalvik虛擬機會爲本地的C組建實例化一個JNIEnv指針,該指針指向Dalvik虛擬機的具體函數列表,當JNI的C組件調用java層方法和屬性時,須要經過JNIEnv指針來進行調用。函數
當C++組件主動調用Java層方法時,須要經過JNI的C組件把JNIEnv指針傳遞給C++組件,此後,c++組件便可經過JNIEnv指針來掌控Java層代碼。
對於JNI和NDK不少Android開發初學者沒有搞明白這個問題:
同時NDK提供的庫和函數功能頗有限,僅僅處理些算法效率敏感的問題
若是你以爲此文對您有所幫助,歡迎入羣 QQ交流羣 :232203809
微信公衆號:終端研發部