Android 将架构信息从gradlew命令传递给cmake

Android 将架构信息从gradlew命令传递给cmake,android,cmake,android-ndk,android-gradle-plugin,Android,Cmake,Android Ndk,Android Gradle Plugin,我的android应用程序支持4种不同的体系结构,即armeabi-v7a、arm64-v8a、x86和x86\u 64。我不希望这些架构中的每一个都是为每一个Android构建的。我希望通过gradlew命令将架构信息作为参数传递,以便跳过其余架构的构建。我知道将-DANDROID_ABI标志作为参数传递给cmake会起作用,但不确定如何通过gradlew命令将其作为参数传递 defaultConfig { minSdkVersion 21 targetSdkVersion 2

我的android应用程序支持4种不同的体系结构,即
armeabi-v7a
arm64-v8a
x86
x86\u 64
。我不希望这些架构中的每一个都是为每一个Android构建的。我希望通过
gradlew
命令将架构信息作为参数传递,以便跳过其余架构的构建。我知道将
-DANDROID_ABI
标志作为参数传递给cmake会起作用,但不确定如何通过
gradlew
命令将其作为参数传递

defaultConfig {
    minSdkVersion 21
    targetSdkVersion 26

    externalNativeBuild {
        cmake {
            cppFlags "-frtti -fexceptions"
            arguments "-DANDROID_ABI=<<requested arch to built>>"
        }
    }
}
defaultConfig{
明斯克版本21
targetSdkVersion 26
外部构建{
克马克{
cppFlags“-frtti-FEExceptions”
参数“-DANDROID_ABI=”
}
}
}

换句话说,如何将此信息从
gradlew
命令传递到cmake?

技巧如下:

android {   
    ...
    defaultConfig {
        externalNativeBuild {
            cmake {
                ...

                if (project.hasProperty("armeabi-v7a")) {
                    abiFilters 'armeabi-v7a'
                } else if (project.hasProperty("arm64-v8a")) {
                    abiFilters 'arm64-v8a'
                } else if (project.hasProperty("x86")) {
                    abiFilters 'x86'
                } else if (project.hasProperty("x86_64")) {
                    abiFilters 'x86_64'
                } else {
                    abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
                }
                ...
            }
        }
    }
}
在命令行中,您可以执行以下操作,例如仅构建abi
armeabi-v7a

./gradlew externalNativeBuild -Parmeabi-v7a

你不能直接使用
abiFilters
https://developer.android.com/studio/build/gradle-tips#configure-separate-apks-per-abi

You can create multiple apks using same code.

android {
  ...
  splits {

    // Configures multiple APKs based on ABI.
    abi {

      // Enables building multiple APKs.
      enable true

      // By default all ABIs are included, so use reset() and include to specify that we only
      // want APKs for x86, armeabi-v7a, and mips.
      reset()

      // Specifies a list of ABIs that Gradle should create APKs for.
      include "x86", "armeabi-v7a", "mips"

      // Specify that we want to also generate a universal APK that includes all ABIs.
      universalApk true
    }
  }
}