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:
- 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
.
而且,-DANDROID_ABI=armeabi-v7a
也不好。您不应在此处定义此参数。 CMake 会根据你的 abiFilters 自动迭代你所有的 ABIs。如果您只想构建 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
。从 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"
}
}
我通过 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 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
.
而且,-DANDROID_ABI=armeabi-v7a
也不好。您不应在此处定义此参数。 CMake 会根据你的 abiFilters 自动迭代你所有的 ABIs。如果您只想构建 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
。从 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?
将下面的 arguments
添加到 cmake
配置:
externalNativeBuild {
cmake {
...
version "3.10.2"
arguments "-GAndroid Gradle - Ninja"
}
}