首页 > 解决方案 > Android Studio CMake/Ninja 不用于构建 NDK 项目

问题描述

我通过 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 的片段:

 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"
        }
    }

如何解决?

标签: androidandroid-studiocmakeandroid-ndkninja

解决方案


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

从 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,具体看下面的官方文档是如何ANDROID_PLATFORM工作的:

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

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

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

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

此外,rtti下面exceptions应该cppFlags是设置这两个标志的正确方法。

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。从以下位置配置 NDK 路径local.properties

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"
    } 
} 

推荐阅读