Cmake的总结:
1:add_library()把需要编译的类库(c的源文件)都添加进来。
2:find_library( log-lib log )找到ndk中提供的类库添加进来,其中log-lib是key,log是value,根据key可以找到我们需要的系统类库。
3:add_library( imported-lib SHARED
IMPORTED ),可以把一个编译好的类库(*•so也添加进来)
4:设置添加进来的各个类库之间的依赖关系target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
第一个参数是目标类库,后面的参数是目标类库要依赖的其他类库,可以配置多个,在这里配置了三个。
5:可以添加的类库分为三种:A自己的c代码编译的类库B已经编译好的类库C系统提供的类库(比方说log库)
6:build.gradle中配置的是构建app的配置参数,Cmake.text中配置的是编译native的参数,为了在编译app的时候也编译native代码,需要把cmake和build.gradle关联起来,以便使用cmake的脚本来编译.so库文件,所以需要在build.gradle中配置camake.text的路径。
6:你需要在 module 层级的 build.gradle 文件中添加externalNativeBuild {}代码块,并且在该代码块中配置cmake {}或ndkBuild {}:
android {
...
defaultConfig {...}
buildTypes {...}
// Encapsulates your external native build configurations.
externalNativeBuild {
// Encapsulates your CMake build configurations.
cmake {
// Provides a relative path to your CMake build script.
path "CMakeLists.txt"
}
}
}
7除了可以配置Cmake.text的路径之外还可以配置cmake编译时的属性,你可以在你的 module 层级的 build.gradle 文件中的defaultConfig {}代码块中,添加externalNativeBuild {}代码块,为 CMake 或 ndk-build 配置一些额外参数。当然,你也可以在你的构建配置中的其他每一个生产渠道重写这些属性。
比如,如果你的 CMake 或者 ndk-build 项目中定义了多个本地库,你想在某个生产渠道使用这些本地库中的几个,你就可以使用targets属性来构建和打包。下面的代码展示了一些你可能会用到的属性:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use ndkBuild {}
cmake {
// Passes optional arguments to CMake.
arguments "-DCMAKE_VERBOSE_MAKEFILE=TRUE"
// Sets optional flags for the C compiler.
cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2"
// Sets a flag to enable format macro constants for the C++ compiler.
cppFlags "-D__STDC_FORMAT_MACROS"
}
}
}
buildTypes {...}
productFlavors {
...
demo {
...
externalNativeBuild {
cmake {
...
// Specifies which native libraries to build and package for this
// product flavor. If you don't configure this property, Gradle
// builds and packages all shared object libraries that you define
// in your CMake or ndk-build project.
targets "native-lib-demo"
}
}
}
paid {
...
externalNativeBuild {
cmake {
...
targets "native-lib-paid"
}
}
}
}
// You use this block to link Gradle to your CMake or ndk-build script.
externalNativeBuild {
cmake {...}
// or ndkBuild {...}
}
}