Android JNI入坑之旅(一):JNI的簡單介紹

來源:互聯網
上載者:User

標籤:註冊   介紹   需要   調試   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的簡單介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.