将Gradle链接到您的本机库

要将本机库项目包含为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列表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值