Android Studio CMake/Ninja 未用于构建 NDK 项目

Android Studio CMake/Ninja Not Used for Building an NDK project

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

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

我在尝试构建我的项目时 运行 进入 "Error Configuring"。这是构建输出:

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

如何解决?

Install/Update 来自 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 的官方文档:

Instead of changing this flag directly, you should set the minSdkVersion property in the defaultConfig or productFlavors blocks of your module-level build.gradle file. This makes sure your library is used only by apps installed on devices running an adequate version of Android. The CMake toolchain then chooses the best platform version for the ABI you're building using the following logic:

  1. If there exists a platform version for the ABI equal to minSdkVersion, CMake uses that version. Otherwise,
  2. if there exists platform versions lower than minSdkVersion for the ABI, CMake uses the highest of those platform versions. This is a reasonable choice because a missing platform version typically means that there were no changes to the native platform APIs since the previous available version.
  3. Otherwise, CMake uses the next available platform version higher than minSdkVersion.

而且,-DANDROID_ABI=armeabi-v7a也不好。您不应在此处定义此参数。 CMake 会根据你的 abiFilters 自动迭代你所有的 ABIs。如果您只想构建 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

what is the fix for -GAndroid Gradle - Ninja?

将下面的 arguments 添加到 cmake 配置:

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