ndk-build
命令用于构建
用于Android系统的静态库
、动态库
、可执行文件
。
使用如下命令查看ndk-build
命令的内容:
cat $(command -v ndk-build)
其内容如下:
#!/bin/sh
DIR="$(cd "$(dirname "$0")" && pwd)"
$DIR/build/ndk-build "$@"
这个脚本的作用就是调用$ANDROID_NDK_HOME/build/ndk-build
脚本,并把传给ndk-build
命令的所有参数全部传递给$ANDROID_NDK_HOME/build/ndk-build
。
$ANDROID_NDK_HOME/build/ndk-build
脚本的作用是解析参数
,并最终调用gmake命令:
$GNUMAKE -f $ANDROID_NDK_HOME/build/core/build-local.mk "$@"
$ANDROID_NDK_HOME/build/core/build-local.mk
主要做4
件事情:
NDK_PROJECT_PATH
变量的值:ndk-build
命令的时候指定了该变量的值,就使用该值;ndk-build
命令的时候没有指定该变量的值,就使用当前目录。NDK_APPLICATION_MK
变量的值:ndk-build
命令的时候指定了该变量的值,就使用该值;ndk-build
命令的时候没有指定该变量的值,就使用$NDK_PROJECT_PATH/jni/Application.mk
; 如果$NDK_PROJECT_PATH/jni/Application.mk
不存在,就使用$ANDROID_NDK_HOME/build/core/default-application.mk
APP_BUILD_SCRIPT
变量的值:ndk-build
命令的时候指定了该变量的值,就使用该值;ndk-build
命令的时候没有指定该变量的值,就使用$NDK_PROJECT_PATH/jni/Android.mk
; 如果$NDK_PROJECT_PATH/jni/Android.mk
不存在,就报错。注意:虽然我们编写的代码可能不涉及到jni
,但是,在没有指定NDK_APPLICATION_MK
和APP_BUILD_SCRIPT
两个变量的情况下, 会去$NDK_PROJECT_PATH/jni
目录下找Application.mk
或Android.mk
,至于为什么是去jni
目录下找,可能当时编写ndk-build
命令的那个家伙实在不知道该使用一个什么名字的目录吧。
流程总结:
ndk-build [option]... [VARIABLE=VLAUE]...
⥥
$ANDROID_NDK_HOME/build/ndk-build "$@"
⥥
$GNUMAKE -f $ANDROID_NDK_HOME/build/core/build-local.mk "$@"
⥥
evaluate $(NDK_PROJECT_PATH)
⥥
evaluate $(NDK_APPLICATION_MK)
⥥
evaluate $(APP_BUILD_SCRIPT)
⥥
build start
从1.2、ndk-build命令的实现原理
,我们知道:ndk-build
命令实际上是对gmake命令的包装。 所以,ndk-build
命令的使用格式与gmake命令的使用格式完全一样。如下:
ndk-build [option]... [VARIABLE=VLAUE]... [target]...
option
、VARIABLE=VLAUE
、target
三者之间可以随意互换位置。
option
、VARIABLE=VLAUE
、target
包括2
部分:
$ANDROID_NDK_HOME/build/ndk-build
、$ANDROID_NDK_HOME/build/core/build-local.mk
、Application.mk
、Android.mk
中定义的。$ANDROID_NDK_HOME/build/core/build-local.mk
中定义的变量变量 | 类型 | 默认值 | 说明 |
---|---|---|---|
V | switch | 0 |
|
NDK_LOG | switch | 0 |
|
NDK_DEBUG | switch | 1 |
|
NDK_HOST_32BIT | switch | 0 |
|
NDK_PROJECT_PATH | DIR_PATH | 当要构建的源码不在当前目录下,或者Application.mk 、Android.mk 不在jni 目录下的时候,需要通过此变量指定 | |
NDK_APPLICATION_MK | FILE_PATH | 当Application.mk 不在jni 目录下的时候,需要通过此变量指定 | |
APP_BUILD_SCRIPT | FILE_PATH | 当Android.mk 不在jni 目录下的时候,需要通过此变量指定 | |
GEN_COMPILE_COMMANDS_DB | boolean | false | 是否生成JSON Compilation Database |
使用示例:
ndk-build V=1 NDK_LOG=1 GEN_COMPILE_COMMANDS_DB=true
SOURCE_PATH=$HOME/libwebp-1.0.2
ndk-build NDK_PROJECT_PATH="$SOURCE_PATH" APP_BUILD_SCRIPT="$SOURCE_PATH/Android.mk" APP_PLATFORM=android-21
使用示例:
ndk-build APP_PLATFORM=21 APP_ABI=armeabi-v7a
使用示例:
ndk-build LOCAL_CFLAGS='-v -Os'
clean
任务用于删除构建后生成的libs
和obj
目录:
ndk-build clean
android {
externalNativeBuild {
ndkBuild {
setPath("src/main/jni/Android.mk")
}
}
}
android {
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
}
用AndroidStudio 2.2 PreView3
之后创建的Android工程,默认使用CMake进行构建的, 与ndk-build
不一样,要注意这一点,你从GitHub上下载的新项目,留意一下。