Android NDK學習筆記1-基礎知識篇

猴子搬來的救兵發表於2016-09-23

引言

最近開發專案用到了多個C語言編寫的動態連結庫so,期間遇到很多問題,專案開發完畢後,我覺得有必要把開發中的一些知識點總結下來,並結合我手邊的一本經典教程《Pro
Android C++ with the NDK》,寫下這個系列的文章,分享給大家,希望給想入門Android NDK開發的朋友帶來幫助。

什麼是 Android NDK?

Android NDK(Native Development Kit )是一套工具集合,允許你用像C/C++語言那樣實現應用程式的一部分。同時,Android NDK對於Android SDK只是個元件,它可以幫我們生成的JNI相容的共享庫可以在大於Android1.5平臺的ARM CPU上執行,將生成的共享庫拷貝到合適的程式工程路徑的位置上,以保證它們自動的新增到你的apk包中。

何時使用NDK?

Google僅在極少數情況下建議使用NDK,有如下使用場景:
● 必須提高效能(例如,對大量資料進行排序)。
● 使用第三方庫。舉例說明:許多第三方庫由C/C++語言編寫,而Android應用程式需要使用現有的第三方庫,如Ffmpeg、OpenCV這樣的庫。
● 底層程式設計(例如,應用程式不依賴Dalvik Java虛擬機器)。

NDK開發有何優點?

1.執行效率高
2.利於充分發揮軟硬體優勢
3.利於程式碼複用
4.降低版本控制成本
5.降低開發成本

NDK開發有何缺點?

1.開發難度相對較高
2.除錯難度相對較高
3.增加開發團隊規模

Android NDK系統檔案的結構如下

  • ndk-build:該shell指令碼是Android NDK構建系統的起始點。
  • ndk-gdb:該shell指令碼允許用GUN偵錯程式除錯原生元件。
  • ndk-stack:該shell指令碼可以幫助分析原生元件崩潰時的堆疊追蹤。
  • build:該目錄包含了Android NDK構建系統的所有模組。
  • platforms:該目錄包含了支援不同Android目標版本的標頭檔案和庫檔案。Android NDK構建系統會根據具體的Android版本自動引用這些文件。
  • samples:該目錄包含了一些示例應用程式,這些程式可以體現AndroidNDK的效能。有利於學習如何使用Android NDK的特性。
  • sorces:該目錄包含了可供開發人員匯入到現有的Android NDK專案的一些共享模組。
  • toolchains:該目錄包含目前Android NDK支援的不同目標機體系結構的交叉編譯器。Android NDK目前支援ARM、X86和MIPS機體系結構。Android NDK 構建系統根據選定的體系結構使用不同的交叉編譯器。

什麼是JNI?

JNI是一種在Java虛擬機器控制下執行程式碼的標準機制。程式碼被編寫成彙編程式或者C/C++程式,並組裝為動態庫。也就允許了非靜態繫結用法。這提供了一個在Java平臺上呼叫C/C++的一種途徑,反之亦然。它允許Java類的某些方法原生實現,同時讓它們能夠像普通Java方法一樣被呼叫和使用。

JNI有什麼優勢?

JNI是Java Native Interface的縮寫,它提供了若干的API實現了Java和其他語言的通訊(主要是C&C++)。

何時使用JNI?

1、JAVA程式和本地程式使用TCP/IP或者IPC進行互動。 2、當用JAVA程式連線本地資料庫時,使用JDBC提供的API。
3、JAVA程式可以使用分散式物件技術,如JAVA IDL API。
這些方案的共同點是,JAVA和C處於不同的執行緒,或者不同的機器上。這樣,當本地程式崩潰時,不會影響到JAVA程式。

相關文章