【问题标题】:Android Studio CMake/Ninja Not Used for Building an NDK projectAndroid Studio CMake/Ninja 不用于构建 NDK 项目
【发布时间】:2019-06-25 11:28:42
【问题描述】:

我通过 Android Studio 的 SDK 工具安装了以下 CMAKE & Ninja:

~/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja --version
1.8.2

我在尝试构建我的项目时遇到了“配置错误”。这是构建输出:

Executable : /Users/ssk/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake
arguments : 
-H/Users/ssk/MyProject
-B/Users/ssk/MyProject/.externalNativeBuild/cmake/debug/armeabi-v7a
-DANDROID_ABI=armeabi-v7a
-DANDROID_PLATFORM=android-16
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/ssk/MyProject/build/intermediates/cmake/debug/obj/armeabi-v7a
-DCMAKE_BUILD_TYPE=Debug
-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle
-DCMAKE_CXX_FLAGS=-std=c++11
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a
-DCMAKE_SYSTEM_VERSION=16
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-DCMAKE_ANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle
-DCMAKE_TOOLCHAIN_FILE=/Users/ssk/Library/Android/sdk/ndk-bundle/build/cmake/android.toolchain.cmake
-G Ninja
-DANDROID_STL=gnustl_statics
-DANDROID_CPP_FEATURES=rtti exception
-DANDROID_TOOLCHAIN=gcc
-DANDROID_NDK=/Users/ssk/android-ndk-r17c/
jvmArgs : 

它不见了:

-DCMAKE_MAKE_PROGRAM=/Users/ssk/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja

错误:

 CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool

只有当我切换到 CMake 版本说 3.6.3155560 时它才能工作。否则,我必须从 brew 或 macports 安装 ninja。

这是我的 build.gradle 中的 sn-p:

 externalNativeBuild {
        cmake {
            // Linker flags and Visibility options keeps the size of the library small
            cppFlags "-std=c++11"
            arguments "-DANDROID_STL=gnustl_static",
                      "-DANDROID_CPP_FEATURES=rtti exceptions",
                      "-DANDROID_TOOLCHAIN=gcc"
        }
    }

如何解决?

【问题讨论】:

标签: android android-studio cmake android-ndk ninja


【解决方案1】:

从 Android Studio SDK 管理器安装/更新 CMake

如果 ninja 存在,请从 sdk 根目录检查您的 CMake。


下面不好。

cmake {
    cppFlags "-std=c++11"
    arguments "-DANDROID_ABI=armeabi-v7a",
                "-DANDROID_PLATFORM=android-16",
                "-DANDROID_STL=gnustl_static",
                "-DANDROID_CPP_FEATURES=rtti exceptions",
                "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=libs"
}

因为ANDROID_PLATFORM应该是由Android外部原生构建系统根据minSdkVersion自动决定的,见下面来自how ANDROID_PLATFORM works的官方文档:

您应该在模块级build.gradle 文件的defaultConfigproductFlavors 块中设置minSdkVersion 属性,而不是直接更改此标志。这可确保您的库仅被安装在运行适当版本 Android 的设备上的应用程序使用。然后,CMake 工具链会使用以下逻辑为您正在构建的 ABI 选择最佳平台版本:

  1. 如果存在等于minSdkVersion 的 ABI 平台版本,CMake 将使用该版本。 否则,
  2. 如果 ABI 存在低于minSdkVersion 的平台版本,CMake 将使用这些平台版本中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着本机平台 API 自上一个可用版本以来没有任何更改。
  3. 否则,CMake 将使用高于 minSdkVersion 的下一个可用平台版本。

而且,-DANDROID_ABI=armeabi-v7a 也不好。您不应在此处定义此参数。 CMake 将根据您的 abiFilters 自动迭代 所有 ABI。如果您只想构建armeabi-v7a,您可以使用abiFilter 指定它,例如

externalNativeBuild {
    cmake {
        abiFilters 'armeabi-v7a', 'arm64-v8a'
    }
}

另外,rttiexceptionscppFlags,下面应该是设置这两个标志的正确方法。

cppFlags "-std=c++11 -frtti -fexceptions"

确保您已正确配置ANDROID_NDK 路径,因为根据您的问题,您设置了两个 版本的NDK,一个是-DANDROID_NDK=/Users/ssk/android-ndk-r17c/,另一个是-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle。从local.properties配置NDK路径:

ndk.dir=/Users/ssk/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/ssk/Library/Android/sdk

-GAndroid Gradle - Ninja 的修复方法是什么?

arguments 下方添加cmake 配置:

externalNativeBuild { 
    cmake { 
        ...
        version "3.10.2"
        arguments "-GAndroid Gradle - Ninja"
    } 
} 

【讨论】:

  • 是的,它确实存在,它是@1.8.2
  • 应该是-GAndroid Gradle - Ninja 而不是-G Ninja?你的gradle.build怎么样?见Build arguments
  • 很好,用 build.gradle 更新了问题。解决方法是什么?谢谢。
  • -GAndroid Gradle - Ninja 的修复方法是什么?我正在使用 gradle 插件 4.4。根据文档: -DCMAKE_MAKE_PROGRAM 启动本机构建系统的工具。 Gradle 插件将此值设置为与 Android SDK 捆绑在一起的 CMake ninja 生成器。
  • 请根据我的 cmets 更新您的build.gradle 并重新编译以查看最新的错误(如果有)。
猜你喜欢
  • 2013-10-13
  • 2015-08-20
  • 2018-09-17
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多