android - 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"
}
}
如何解决?
解决方案
从 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 选择最佳平台版本:defaultConfig
productFlavors
build.gradle
- 如果存在 ABI 的平台版本等于
minSdkVersion
,则 CMake 使用该版本。除此以外,- 如果存在低于
minSdkVersion
ABI 的平台版本,CMake 将使用这些平台版本中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自上一个可用版本以来本机平台 API 没有任何更改。- 否则,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"
}
}
推荐阅读
- apache - proxypass后无法登录
- react-native - 反应原生的两个堆栈导航器
- sql - 出现错误“ORA-00933:SQL 命令未正确结束”
- google-apps-script - 如何授予 Apps Script Web App 授权以使用服务帐户为域中的所有用户访问 Google 表格
- javascript - 如何在反应中将数据从无状态子组件发送到无状态父组件?
- python-3.x - 将任意数量的参数从列表传递给函数?
- php - 如何包含来自古腾堡插件子文件夹的脚本
- android - 可变自定义视图和 Android Studio 设计/布局编辑器
- android - 如何在添加成功侦听器中传递查询
- api - 如何在 API Manager 中激活新实例并在 mule 上停止旧实例?