Android SDK中下載NDK
, LLDB
android
簡單來講android-studio
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
Android.mk 和 Application.mk 都放在 jni 目錄下,,
項目文件結構以下
|____app | |____src | | |____main | | | |____jni | | | | |____Android.mk | | | | |____Application.mk | | | | |____blur.cpp
前面已經給出了 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" } }
若是能直接引用生成好的 .so 文件,能夠避免重複編譯 .so 文件,從而加快應用 build 速度
下面是手動生成 .so 文件的步驟
cd app/src/main
/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 文件發給其餘人就行了
測試結果: (測試均在 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/