Android NDK初識

Android NDK是Android軟件開發包(SDK)的相關工具集,用來擴展Android SDK的功能,從而使開發人員可以使用機器代碼生成的編程語言(如C、C++和彙編語言)實現一些對代碼性能要求較高的模塊,並將這些模塊嵌入到Android應用程序中使用。java

什麼是Android NDK?

Android NDK是Android軟件開發包(SDK)的相關工具集,用來擴展Android SDK的功能,從而使開發人員可以使用機器代碼生成的編程語言(如C、C++和彙編語言)實現一些對代碼性能要求較高的模塊,並將這些模塊嵌入到Android應用程序中使用。android

NDK 不適用於大多數初學的 Android 編程者,對許多類型的 Android 應用沒什麼價值。 由於它不可避免地會增長開發過程的複雜性,因此一般不值得使用。 但若是您須要執行如下操做,它可能頗有用:c++

  • 在平臺之間移植其應用。
  • 重複使用現有庫,或者提供其本身的庫供重複使用。
  • 在某些狀況下提升性能,特別是像遊戲這種計算密集型應用。

Android NDK提供的組件

Android NDK不是一個單獨的工具,他是一個包含API、交叉編譯器、連接程序、調試器、構建工具、文檔和示例應用程序的綜合工具集。如下是Android NDK的一些主要組件:shell

  • ARM、x86和MIPS交叉編譯器
  • 構建系統
  • Java原生接口頭文件(jni)
  • C庫
  • Math庫
  • POSIX線程
  • 最小的C++庫
  • ZLib壓縮庫
  • 動態連接庫
  • Android日誌庫
  • Android像素緩衝區庫
  • Android原生應用APIs
  • OpenGL ES 3D圖形庫
  • OpenSL ES原生音頻庫
  • OpenMAX AL最小支持

Android NDK的結構

Android NDK組件都被安裝在NDK的根目錄下,下面介紹一些重要的文件和子目錄。編程

  • ndk-build:ndk-build 腳本用於在 NDK 中心啓動構建腳本,這些腳本:架構

    • 自動探測您的開發系統和應用項目文件以肯定要構建的內容。
    • 生成二進制文件。
    • 生成二進制文件。
  • ndk-gdb:該shell腳本容許用GUN調試器調試原生組件。
  • ndk-stack:該shell腳本能夠幫助分析原生組件崩潰時的堆棧追蹤。
  • build:該目錄包含了Android NDK構建系統的全部模塊。
  • platforms:該目錄包含了支持不一樣Android目標版本的頭文件和庫文件。Android NDK構建系統會根據具體的Android版本自動引用這些文檔。
  • sources:該目錄包含了可供開發人員導入到現有的Android NDK項目的一些共享模塊。
  • toolchains:該目錄包含目前Android NDK支持的不一樣目標機體系結構的交叉編譯器。Android NDK目前支持ARM、X86和MIPS機體系結構。Android NDK構建系統根據選定的體系結構使用不一樣的交叉編譯器。

Android NDK的開發流程

  1. 在java中聲明Native方法編程語言

    public native String hello();
  2. 在jni目錄中實現原生方法工具

    1. 首先建立jni目錄。

    2. 在jni目錄中建立c/c++文件,並實現對應的方法。性能

      #include <jni.h>
      #include <stdio.h>
      #include <stdlib.h>
      
      extern "C"
      JNIEXPORT jstring JNICALL
      Java_cn_com_codeteenager_ndkone_MainActivity_hello(JNIEnv *env, jobject obj) {
      
       return env->NewStringUTF("Hello World");
      }
    3. 添加Android.mk文件。gradle

      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      LOCAL_MODULE := helloworld
      LOCAL_SRC_FILES := HelloWorld.cpp
      LOCAL_C_INCLUDES += $(LOCAL_PATH)
       #LOCAL_LDLIBS := -llog
      include $(BUILD_SHARED_LIBRARY)
    4. 添加Application.mk文件。

      # 指定生成哪些cpu架構的庫
      APP_ABI := armeabi-v7a
      # 此變量包含目標 Android 平臺的名稱
      APP_PLATFORM := android-22

  3. 經過命令行打開jni目錄,而後執行ndk-build命令腳本進行編譯。編譯後的項目結果如圖所示。

    • jni:該目錄包含原生組件的源代碼以及描述原生組件構建方法的Android.mk構建文件。
    • libs:在Android NDK構建系統的構建過程當中建立該目錄。他包含指定的目標機體系結構的獨立子目錄,在打包過程當中該目錄被包含在APK文件中。
    • obj:這是一箇中間目錄,編譯源代碼後所產生的目標文件都保存在該目錄下。

Android NDK構建系統

Android NDK的構建系統是基於GUN Make的。該構建系統的主要目的是使開發人員可以用很短的構建文檔來描述原生的Android應用程序。

Android NDK的其餘兩種編譯方式

上述Android NDK的開發流程中經過配置Android.mk來編譯是其中的一種方式,還有兩種方式。

經過配置Android Studio中build.gradle來編譯

這種方式簡化了編寫Android.mk文件,跟上述流程同樣,只是不須要編寫Android.mk和Application.mk,可是須要添加兩樣配置。

  • 在項目的gradle.properties中,添加android.useDeprecatedNdk = true。
  • 在主Module的build.gradle的defaultConfig裏添加

    ndk{
             moduleName 'hello'
            abiFilter 'armeabi-v7a'
           }

注意:這種方式沒法再Android Studio3.0以上使用,只能在3.0如下使用,3.0及以上採用cmake來編譯生成so文件。

經過Android Studio的cmake插件編譯

在Android Studio2.2及以上版本中,能夠使用cmake插件來編譯c庫,這也是最新的ndk開發方式。首先你須要在SDK Tools中下載CMake和LLDB這兩個組件,固然ndk也是必須的。

  • CMake:一款外部構建工具,可與Gradle搭配使用來構建原生庫。若是您想用ndk-build,則不須要此組件。
  • LLDB:一種調試程序,Android Studio使用它來調試原生代碼。

當你安裝好上述兩個組件後,你能夠使用Android Studio建立支持C/C++的新項目。步驟以下:

  1. 在嚮導的 Configure your new project 部分,選中 Include C++ Support 複選框。
  2. 點擊 Next
  3. 正常填寫全部其餘字段並完成嚮導接下來的幾個部分。
  4. 在嚮導的 Customize C++ Support 部分,您能夠使用下列選項自定義項目:

    • C++ Standard:使用下拉列表選擇您但願使用哪一種 C++ 標準。選擇 Toolchain Default 會使用默認的 CMake 設置。
    • Exceptions Support:若是您但願啓用對 C++ 異常處理的支持,請選中此複選框。若是啓用此複選框,Android Studio 會將 -fexceptions 標誌添加到模塊級 build.gradle 文件的 cppFlags 中,Gradle 會將其傳遞到 CMake。
    • Runtime Type Information Support:若是您但願支持 RTTI,請選中此複選框。若是啓用此複選框,Android Studio 會將 -frtti 標誌添加到模塊級 build.gradle 文件的 cppFlags 中,Gradle 會將其傳遞到 CMake。
  5. 點擊 Finish,建立成功,項目結構以下圖所示。

    • cpp文件夾用於存放C/C++文件。
    • 在External Build Files中,CMakeLists.txt是構建原生庫的CMake腳本。

當你建立完成項目後點擊Android Studio中Build->Make Project,系統會幫你構建完成後,你就能夠在相對應Module下的build->intermediates->cmake下找到so庫。

相關文章
相關標籤/搜索