Android Studio CMake/Ninja 不用于构建 NDK 项目 [英] Android Studio CMake/Ninja Not Used for Building an NDK project
问题描述
我有以下 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
如何工作:
您应该在模块级 defaultConfig
或 productFlavors
块中设置 minSdkVersion
属性,而不是直接更改此标志>build.gradle 文件.这可确保您的库仅由安装在运行适当版本的 Android 的设备上的应用程序使用.然后,CMake 工具链使用以下逻辑为您正在构建的 ABI 选择最佳平台版本:
- 如果 ABI 存在等于
minSdkVersion
的平台版本,CMake 将使用该版本.否则, - 如果 ABI 存在低于
minSdkVersion
的平台版本,CMake 将使用这些平台版本中的最高版本.这是一个合理的选择,因为缺少平台版本通常意味着自上一个可用版本以来本机平台 API 没有任何更改. - 否则,CMake 将使用高于
minSdkVersion
的下一个可用平台版本.
而且,-DANDROID_ABI=armeabi-v7a
也不好.您不应在此处定义此参数.CMake 将根据您的 abiFilters 自动迭代您的所有 ABI.如果您只想构建 armeabi-v7a
,您可以使用 abiFilter
指定它,例如
externalNativeBuild {制作{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
.从 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 thedefaultConfig
orproductFlavors
blocks of your module-levelbuild.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:
- If there exists a platform version for the ABI equal to
minSdkVersion
, CMake uses that version. Otherwise,- 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.- 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屋!