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/