標籤:註冊 介紹 需要 調試 margin code adl evel 基本
1.JNI簡介
JNI全稱為Java Native Interface;
從Java1.1開始,JNI就成為java平台的一部分,它允許Java代碼和其他語言寫的代碼(如C&C++)進行互動;
並非從Android發布才引入JNI的概念的。
2.什麼是NDK?
NDK全稱為native development kit本地語言(C&C++)開發包;
NDK提供了一些交叉編譯工具鏈和Android內建的庫;
這些Android的庫可以讓開發人員在編寫本地語言的程式時調用;
而NDK提供的交叉編譯工具鏈就對已經編寫好的C&C++代碼進行編譯,產生庫。
3.JNI的基本調用流程
1).Android應用程式層以Java為基礎,.java檔案在被編譯成.dex檔案後必須要通過Dalvik虛擬機器( Virtual Machine)來執行;
2).執行過程中如果需要用到本地方法(即C/C++函數庫),Dalvik則去載入C/C++本地函數庫(System.loadLibrary("libName"););
注意:由於C/C++本地函數庫並不運行在Dalvik虛擬機器中,所以效率和速度都相對較快;
3).Dalvik虛擬機器載入C/C++函數庫成功之後會自動地尋找庫裡面的JNI_OnLoad函數(關於JNI_OnLoad函數後面會有詳細說明);
4).虛擬機器釋放C/C++函數庫時,與JNI_OnLoad函數相對應的JNI_OnUnLoad函數會被調用,用以處理善後清除工作。
4.關於JNI_OnLoad函數的一些說明
1).告知Dalvik虛擬機器該C/C++函數庫使用哪一個JNI版本;
2).庫中沒有該函數時預設使用JNI1.1版本;
3).新版JNI在功能上有很多的擴充,想要使用這些新功能必須在JNI_OnLoad()函數中聲明JNI的版本:
1 result = JNI_VERSION_1_4;
4).庫中沒有JNI_OnLoad()函數時,Android調試資訊會給出"No JNI_OnLoad found"的提示;
5).C/C++函數庫載入完成後首先調用JNI_OnLoad()方法,可以在該方法中進行一些初始化工作,如註冊JNI函數等等(可加快調用效率和速度);
Android JNI入坑之旅(一):JNI的簡單介紹