NDK配置

NDK 配置

Android SDK中下載NDK, LLDBandroid

Android.mk 和 Application.mk

簡單來講android-studio

  • Android.mk 用來描述須要生成哪些模塊的 .so 文件
  • Application.mk 用來描述如何生成 .so 文件,生成靜態庫仍是動態庫
    這裏給出示例文件

Android.mkapp

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gaussianBlur
LOCAL_SRC_FILES := blur.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
  • 宏函數 my-dir 是由編譯系統提供的,會返回當前目錄的路徑(當前目錄指的是包含 Android.mk 的目錄)函數

  • CLEAR_VARS 這個變量也是由編譯系統提供的,會清除不少 LOCAL_XXX 變量測試

  • 以上兩行命令基本上是固定的,不須要去動gradle

  • LOCAL_MODULE 指定模塊名稱,會自動生成相應的 libgaussianBlur.so 文件ui

  • LOCAL_SRC_FILES 指定這個模塊要編譯的 C++ 文件調試

  • LOCAL_LDLIBS 指定這個模塊裏會用到哪些原生 API, 詳見 Android NDK Native APIs日誌

  • BUILD_SHARED_LIBRARY 根據你以前定義的 LOCAL_XXX 變量,決定要編譯啥,如何去編譯,這行命令通常也不須要動,固定的code

Application.mk

APP_STL := gnustl_static
  • APP_STL 指定使用哪些 C++ 運行時, 詳見 C++ Library Support

Android.mk 和 Application.mk 都放在 jni 目錄下,,
項目文件結構以下

|____app
| |____src
| | |____main
| | | |____jni
| | | | |____Android.mk
| | | | |____Application.mk
| | | | |____blur.cpp

如何使用 C++ 代碼?

前面已經給出了 Android.mk 和 Application.mk 的示例,下面在 build.gradle 裏配置 externalNativeBuild 就能夠自動編譯 C++ 代碼了

示例內容以下

defaultConfig {
    applicationId "com.example.app"
    minSdkVersion 16
    targetSdkVersion 24
    versionCode 102
    versionName "0.2"
    externalNativeBuild {
        ndkBuild {
            arguments "NDK_APPLICATION_MK:=src/main/jni/Application.mk"
            cFlags "-DTEST_C_FLAG1", "-DTEST_C_FLAG2"
            cppFlags "-DTEST_CPP_FLAG2", "-DTEST_CPP_FLAG2"
            abiFilters "armeabi-v7a", "armeabi"
        }
    }
}
externalNativeBuild {
    ndkBuild {
        path "src/main/jni/Android.mk"
    }
}
  • path 用來指定 Android.mk 的路徑
  • arguments 用來指定 Application.mk 的路徑
  • abiFilters 用來指定生成哪些平臺的 .so 文件
  • cFlags 和 cppFlags 是用來設置環境變量的, 通常不須要動,和示例同樣就好,
    好了,如今運行項目,就能夠將 blur.cpp 自動編譯爲 libgaussianBlur.so 文件了

手動生成 .so 文件

若是能直接引用生成好的 .so 文件,能夠避免重複編譯 .so 文件,從而加快應用 build 速度

下面是手動生成 .so 文件的步驟

進入 main 目錄

cd app/src/main

生成 .so 文件

/Users/lee/Library/Android/sdk/ndk-bundle/ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=./jni/Application.mk NDK_LIBS_OUT=./jniLibs

執行這個命令後,會在 app/src/main/jniLibs 目錄生成各個平臺的 .so 文件
若是須要把 .so 文件共享給其餘人,把這些平臺下的 .so 文件發給其餘人就行了

  • NDK_PROJECT_PATH 指定項目路徑, 會自動讀取這個目錄下的 jni/Android.mk 文件
  • NDK_APPLICATION_MK 指定 Application.mk 的位置
  • NDK_LIBS_OUT 指定將生成的 .so 文件放到哪一個目錄,默認 Android Studio 會讀取 jniLibs 目錄下的 .so 文件, 因此咱們把 .so 文件生成到這

測試結果: (測試均在 clean 項目後進行)
引用 .so 文件前平均耗時 1m 27s
引用 .so 文件後平均耗時 47s
咱們能夠看到 build 速度快了將近一倍

調試 NDK
讓 NDK_LOG 變量爲1,就能夠打印日誌信息

ndk-build -e NDK_LOG=1

參考

http://jk2k.com/2016/09/how-to-use-ndk-and-generate-so-file-in-android-studio/

相關文章
相關標籤/搜索