我通过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安装忍者。
这是我的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"
}
}
如何解决?
答案 0 :(得分:2)
从Android Studio 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的官方文档:
应该直接在模块级
minSdkVersion
文件的defaultConfig
或productFlavors
块中设置build.gradle
属性,而不是直接更改此标志。这样可以确保您的库仅由运行适当版本的Android的设备上安装的应用程序使用。然后,CMake工具链会使用以下逻辑为正在构建的ABI选择最佳平台版本:
- 如果ABI的平台版本等于
minSdkVersion
,则CMake将使用该版本。 否则,- 如果ABI的平台版本低于
minSdkVersion
,则CMake将使用这些平台中的最高版本。这是一个合理的选择,因为缺少平台版本通常意味着自从先前的可用版本以来,本机平台API一直没有更改。- 否则,CMake将使用高于
minSdkVersion
的下一个可用平台版本。
而且-DANDROID_ABI=armeabi-v7a
也不是很好。您不应在此处定义此参数。 CMake将根据您的abiFilter自动迭代所有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/
,另一个是{ {1}}。从-DANDROID_NDK=/Users/ssk/Library/Android/sdk/ndk-bundle
配置NDK路径:
local.properties
-GAndroid Gradle-Ninja的修复程序是什么?
在ndk.dir=/Users/ssk/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/ssk/Library/Android/sdk
下方添加到arguments
的配置中:
cmake