要将本机库项目包含为Gradle构建依赖项,需要为Gradle提供CMake或ndk-build脚本文件的路径。在构建应用程序时,Gradle运行CMake或ndk-build,并使用APK打包共享库。Gradle还使用构建脚本来了解要将哪些文件引入Android Studio项目,以便您可以从“ 项目”窗口访问它们 。如果您没有本机源的构建脚本,则需要在继续之前创建CMake构建脚本。
Android项目中的每个模块都只能链接到一个CMake或ndk-build脚本文件。因此,例如,如果要构建和打包来自多个CMake项目的输出,则需要使用一个CMakeLists.txt文件作为顶级CMake构建脚本(然后将Gradle链接到该脚本)并 添加其他CMake项目作为该构建的依赖项脚本。同样,如果您使用的是ndk-build,则可以在顶级 脚本文件中包含其他MakefileAndroid.mk。
将Gradle链接到本机项目后,Android Studio将更新“ 项目”窗格以显示cpp组中的源文件和本机库,以及外部构建文件组中的外部构建脚本 。
注意:更改Gradle配置时,请确保通过单击 工具栏中的“ 同步项目” 来应用更改。此外,在您将CMake或ndk-build脚本文件链接到Gradle之后对其进行更改时,您应该通过从菜单栏中选择“ 生成”>“刷新链接的C ++项目”来同步Android Studio和您的更改。
使用Android Studio UI
您可以使用Android Studio UI将Gradle链接到外部CMake或ndk-build项目:
从IDE左侧打开“ 项目”窗格,然后选择Android视图。
右键单击要链接到本机库的模块(例如应用程序模块),然后从菜单中选择“使用Gradle链接C ++项目 ”。您应该看到类似于图4所示的对话框。
从下拉菜单中,选择CMake或 ndk-build。
如果选择CMake,请使用“ 项目路径”旁边的字段指定CMakeLists.txt外部CMake项目的脚本文件。
如果选择ndk-build,请使用“ 项目路径”旁边的字段 指定Android.mk外部ndk-build项目的脚本文件。 如果文件与文件位于同一目录中,则 Android Studio还包含该 文件。 Application.mkAndroid.mk
图4.使用Android Studio对话框链接外部C ++项目。
单击确定。
手动配置Gradle
要手动配置Gradle以链接到本机库,您需要将块添加到模块级 文件并使用或块配置它: externalNativeBuildbuild.gradle cmake ndkBuild
android {
…
defaultConfig {…}
buildTypes {…}
//封装外部本机构建配置。
externalNativeBuild {
//封装您的CMake构建配置。
cmake {
//提供CMake构建脚本的相对路径。
路径“CMakeLists.txt”
}
}
}
注意:如果要将Gradle链接到现有的ndk-build项目,请使用块而不是块,并提供文件的相对路径。如果文件与文件位于同一目录中,Gradle也会包含该文件。 ndkBuild cmakeAndroid.mkApplication.mkAndroid.mk
指定可选配置
您可以通过在模块级文件的块中 配置另一个块 来为CMake或ndk-build指定可选参数和标志。与块中的其他属性类似 ,您可以在构建配置中为每个产品flavor覆盖这些属性。 externalNativeBuilddefaultConfigbuild.gradledefaultConfig
例如,如果您的CMake或ndk-build项目定义了多个本机库和可执行文件,则可以使用该属性为给定的产品风格构建和打包这些工件的子集。以下代码示例描述了您可以配置的一些属性: targets
android {
…
defaultConfig {
…
//此块与用于链接Gradle的块不同
//到您的CMake或ndk-build脚本。
externalNativeBuild {
//对于ndk-build,改为使用ndkBuild块。
cmake {
//将可选参数传递给CMake。
参数“-DANDROID_ARM_NEON = TRUE” ,“ - DANDROID_TOOLCHAIN = clang”
//设置一个标志以启用C编译器的格式宏常量。
cFlags “-D__STDC_FORMAT_MACROS”
//为C ++编译器设置可选标志。
cppFlags “-fexceptions” ,“ - frtti”
}
}
}
buildTypes {…}
productFlavors {
…
demo {
…
externalNativeBuild {
cmake {
…
//指定要构建和打包的本机库或可执行文件
//对于这种产品的味道。以下告诉Gradle只构建
//来自链接的“native-lib-demo”和“my-executible-demo”输出
// CMake项目 如果您不配置此属性,Gradle将构建所有属性
//您在CMake中定义的可执行文件和共享对象库
//(或ndk-build)项目。但是,默认情况下,Gradle仅打包
// APK中的共享库
目标“native-lib-demo” ,
//您需要在CMakeLists.txt中指定此可执行文件及其来源
//使用add_executable()命令。但是,从您的构建可执行文件
//本机源是可选的,并构建要打包的本机库
//您的APK满足大多数项目要求。
“我-executible-演示”
}
}
}
付费{
...
externalNativeBuild {
cmake {
...
目标“本地自由支付” ,
“我-executible付费”
}
}
}
}
//使用此块将Gradle链接到CMake或ndk-build脚本。
externalNativeBuild {
cmake {…}
//或ndkBuild {…}
}
}
要了解有关配置产品flavor和构建变体的更多信息,请转至 Configure Build Variants。有关可以使用arguments属性配置CMake的变量列表 ,请参阅使用CMake变量。
包括预先构建的本机库
如果您希望Gradle使用APK打包预构建的本机库,请 修改默认的源集配置 以包含预构建.so文件的目录,如下所示。请记住,您不需要这样做就可以包含链接到Gradle的CMake构建脚本的工件。
android {
…
sourceSets {
主{
jniLibs 。srcDirs’introduced -lib / src /’ ,‘more-imported-libs / src /’
}
}
}
指定ABI
默认情况下,Gradle将您的本机库构建.so 为NDK支持的ABI的单独文件, 并将它们全部打包到您的APK中。如果希望Gradle只构建和打包本机库的某些ABI配置,可以使用模块级文件中的标志 指定它们,如下所示: ndk.abiFiltersbuild.gradle
android {
…
defaultConfig {
…
externalNativeBuild {
cmake {…}
//或ndkBuild {…}
}
//与块中的其他属性类似defaultConfig,
//您可以为每种产品风格配置ndk块
//在您的构建配置中。
ndk {
//指定本机的ABI配置
//库Gradle应该使用你的APK构建和打包。
abiFilters'x86 ' ,'x86_64' ,'armeabi' ,'armeabi-v7a' ,
'arm64-V8A'
}
}
buildTypes {…}
externalNativeBuild {…}
}
在大多数情况下,您只需要abiFilters在 ndk块中指定,如上所示,因为它告诉Gradle构建和打包本机库的那些版本。但是,如果您想要控制Gradle应该构建的内容,而不是您希望将其打包到APK中,请abiFilters在块(或块)中配置另一个标志 。Gradle构建那些ABI配置,但只打包您在块中指定的配置 。 defaultConfig.externalNativeBuild.cmake defaultConfig.externalNativeBuild.ndkBuild defaultConfig.ndk
要进一步缩小APK的大小,请考虑根据ABI配置多个APK,而不是使用本机库的所有版本创建一个大型APK,Gradle会为您要支持的每个ABI创建一个单独的APK,并且每个只打包文件ABI需要。如果您为每个ABI配置多个APK而未指定abiFilters上面的代码示例中显示的 标志,Gradle将构建您的本机库的所有受支持的ABI版本,但仅包含您在多个APK配置中指定的那些版本。为了避免构建您不想要的本机库版本,请为abiFilters标志和每个ABI多个APK配置提供相同的ABI列表。