Android JNI和NDK有什麼區別

jia635發表於2014-09-29


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類庫可能不支援你的程式所需的特性。 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應用一起打包,極大地減輕了開發人員的打包工作。

相關文章