JNI是Java調用Native機制,是Java語言本身的特性全稱爲Java Native Interface,相似的還有微軟.Net Framework上的p/invoke,可讓C#或Visual Basic.Net能夠調用C/C++的API,因此說JNI和Android沒有關係,在PC上開發Java的應用,若是運行在Windows平臺使用JNI是是常常的,好比說讀寫Windows的註冊表。JNI是Java Native Interface的縮寫,中文爲JAVA本地調用。從Java1.1開始,Java Native Interface(JNI)標準成爲java平臺的一部分,它容許Java代碼和其餘語言寫的代碼進行交互。JNI一開始是爲了本地已編譯語言,尤爲是C和C++而設計的,可是它並不妨礙你使用其餘語言,只要調用約定受支持就能夠了。使用java與本地已編譯的代碼交互,一般會喪失平臺可移植性。可是,有些狀況下這樣作是能夠接受的,甚至是必須的,好比,使用一些舊的庫,與硬件、操做系統進行交互,或者爲了提升程序的性能。JNI標準至少保證本地代碼能工做在任何Java 虛擬機實現下。java
標準的java類庫可能不支持你的程序所需的特性。 JNI·或許你已經有了一個用其餘語言寫成的庫或程序,而你但願在java程序中使用它。你可能須要用底層語言實現一個小型的時間敏感代碼,好比彙編,而後在你的java程序中調用這些功能。算法
NDK是Google公司推出的幫助Android開發者經過C/C++本地語言編寫應用的開發包,包含了C/C++的頭文件、庫文件、說明文檔和示例代碼,咱們能夠理解爲Windows Platform SDK同樣,是純C/C++編寫的,可是Android並不支持純C/C++編寫的應用,同時NDK提供的庫和函數功能頗有限,僅僅處理些算法效率敏感的問題,因此推薦初學者學好Java後再學習JNI。函數
NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平臺、ABI等差別,開發人員只須要簡單修改mk文件(指出「哪些文件須要編譯」、「編譯特性要求」等),就能夠建立出so。性能
NDK能夠自動地將so和Java應用一塊兒打包,極大地減輕了開發人員的打包工做。學習