Android Studio CMake/Ninja 不用于构建 NDK 项目 [英] Android Studio CMake/Ninja Not Used for Building an NDK project

查看:125
本文介绍了Android Studio CMake/Ninja 不用于构建 NDK 项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

~/Library/Android/sdk/cmake/3.10.2.4988404/bin/ninja --version1.8.2

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

可执行文件:/Users/ssk/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake参数:-H/用户/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=调试-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle-DCMAKE_CXX_FLAGS=-std=c++11-DCMAKE_SYSTEM_NAME=安卓-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 忍者-DANDROID_STL=gnustl_statics-DANDROID_CPP_FEATURES=rtti 异常-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 无法找到对应于Ninja"的构建程序.CMAKE_MAKE_PROGRAM 未设置.您可能需要选择不同的构建工具

仅当我切换到 CMake 版本时说 3.6.3155560 才有效.否则,我必须从 brew 或 macports 安装 ninja.

这是我的 build.gradle 的片段:

 externalNativeBuild {制作{//链接器标志和可见性选项使库的大小保持较小cppFlags "-std=c++11"参数-DANDROID_STL=gnustl_static","-DANDROID_CPP_FEATURES=rtti 异常",-DANDROID_TOOLCHAIN=gcc"}}

如何解决?

解决方案

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

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

<小时>

下面不好.

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

因为ANDROID_PLATFORM 应该由Android 外部原生构建系统根据minSdkVersion 自动决定,请参阅ANDROID_PLATFORM 如何工作:

<块引用>

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

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

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

externalNativeBuild {制作{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-bundlesdk.dir=/Users/ssk/Library/Android/sdk

<块引用>

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

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

externalNativeBuild {制作{...版本3.10.2"参数-GAndroid Gradle - Ninja"}}

I have the following CMAKE & Ninja installed through Android Studio's SDK Tools:

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

I run into "Error Configuring" while trying to build my project. Here is the build output:

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 : 

It's missing:

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

Error:

 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

Only if I switch to CMake version say 3.6.3155560 it works. Otherwise, I have to install ninja from brew or macports.

Here is the snippet from my 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"
        }
    }

How to fix it?

解决方案

Install/Update CMake From Android Studio SDK Manager

Check your CMake from sdk root directory if ninja exists.


Below is not good.

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

Because, ANDROID_PLATFORM should be automatically decided by Android external native build system according to minSdkVersion, see below official document from 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.

And, -DANDROID_ABI=armeabi-v7a is not good as well. You should not define this parameter here. CMake will iterate all your ABIs according to your abiFilters automatically. If you just want to build armeabi-v7a, you can specify this using abiFilter, e.g.

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

Also, rtti and exceptions are cppFlags, below should be the proper way to set these two flags.

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

Ensure that your have properly configured ANDROID_NDK path, because according to your question, you have TWO version of NDK set, one is -DANDROID_NDK=/Users/ssk/android-ndk-r17c/, the other one is -DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle. Config NDK path from local.properties:

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

what is the fix for -GAndroid Gradle - Ninja?

Add below arguments to the cmake config:

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

这篇关于Android Studio CMake/Ninja 不用于构建 NDK 项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆