【问题标题】:How to set CmakeLists path in product flavor for each Android ABI?如何为每个 Android ABI 在产品风格中设置 CmakeLists 路径?
【发布时间】:2017-10-16 22:46:24
【问题描述】:

我需要为每个 Android ABI 提供一个单独的 CMakeLists.txt。我尝试使用产品风味来设置 CMakeLists.txt 的路径。但我在从命令行运行./gradlew assembleDebug 或任何其他 gradle 命令时遇到以下错误。

在对象上找不到参数 [CMakeLists.txt] 的方法 path() 类型 com.android.build.gradle.internal.dsl.ExternalNativeCmakeOptions。

这是我在 build.gradle 中设置产品风格的方式。

productFlavors {
    arm64_v8a {
        ndk {
            abiFilters "arm64-v8a"
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
    x86_64 {
        ndk {
            abiFilters "x86_64"
        }
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
}

注意 - 我最初将文件命名为“CMakeLists_arm64-v8a.txt”和“CMakeLists_x86_64.txt”。但这失败了,所以尝试了相同的名称。

如何解决此问题或有解决方法?

【问题讨论】:

  • 您好,您找到解决方案了吗?

标签: android cmake android-gradle-plugin


【解决方案1】:

不,对于不同的风格和/或 ABI,您不能有不同的 CMakeLists.txt 路径,但您可以使用参数在您的 cmake 脚本中添加条件,例如:

flavorDimensions "abi"
productFlavors {
    arm64_v8a {
        dimension "abi"
        ndk {
            abiFilters "arm64-v8a"
        }
        externalNativeBuild {
            cmake {
                arguments "-DFLAVOR=ARM"
            }
        }
    }
    x86_64 {
        dimension "abi"
        ndk {
            abiFilters "x86_64"
        }
        externalNativeBuild {
            cmake {
                arguments "-DFLAVOR=x86"
            }
        }
    }
}

现在您可以在 CMakeLists.txt 中检查此内容:

if (FLAVOR STREQUAL 'ARM')
  include(arm.cmake)
endif()

但在您的情况下,您可以依赖 Android Studio 定义的参数,不需要您自己的参数:

if (ANDROID_ABI STREQUAL 'arm64-v8a')
  include(arm.cmake)
endif()

实际上,您可能根本不需要单独的 productFlavor,而是使用 splits 为每个 ABI 生成精简 APK。

【讨论】:

猜你喜欢
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2015-11-03
相关资源
最近更新 更多