I’m working through building for Android, specifically with NDK r23. From that NDK release, we should be back to a fully supported arrangement again if we are using CMake 3.21 or later. I want to record here things I find that still seem to be not in sync, docs that need updating around this, etc. The discussion thread may end up a bit disjointed, but I need somewhere to collect questions, discuss and record findings.
Docs for CMAKE_ANDROID_NDK state the following:
When Cross Compiling for Android with the NDK, this variable holds the absolute path to the root directory of the NDK. The directory must contain a
platforms
subdirectory holding theandroid-<api>
directories.
Looking at what the NDK’s toolchain sets this to though, this is not true. While the value is set to the root of the NDK, that is not where the platforms
directory is located. The platforms
directory is actually two more levels up, under the sdk
directory (I’m using an Android Studio installation on macOS for reference). The build seems to work without any warnings, so I’m wondering if the second sentence in the above is no longer true?
A number of Android-specific properties appear to only be used by some scenarios, but the docs don’t mention this. For example, (at least) the following target properties seem to only be used in the Visual Studio generator, so presumably they only apply to the NVIDA Nsight Tegra setup:
- ANDROID_NATIVE_LIB_DEPENDENCIES
- ANDROID_NATIVE_LIB_DIRECTORIES
- ANDROID_JAVA_SOURCE_DIR
- ANDROID_JAR_DIRECTORIES
- ANDROID_JAR_DEPENDENCIES
- ANDROID_ASSETS_DIRECTORIES
- ANDROID_PROCESS_MAX
- ANDROID_PROGUARD
- ANDROID_PROGUARD_CONFIG_PATH
- ANDROID_SECURE_PROPS_PATH
- ANDROID_SKIP_ANT_STEP
- ANDROID_ANT_ADDITIONAL_OPTIONS
For someone using just the NDK exclusively, it may not be immediately obvious that none of the above properties are relevant or used. Their documentation should at least be updated to specify under what conditions they are used. Other Android-related properties do generally indicate whether they are intended for the NVIDIA Nsight Tegra setup, or the NDK, or both (or their name makes it obvious).
Out of interest, is the NVIDIA Nsight Tegra setup still even used or maintained?
that is not where the platforms directory is located
Maybe something changed in NDK versions since that was written.
All the existing support and documentation was developed using the NDKs found on the Android NDK download page. Please check those versions too.
AFAIK it is not tested or maintained, but I also don’t know for sure that it is broken or unused.
The Nsight Tegra mode was added before the rest of the Android support, so at the time those variables were documented such context was not needed. Appropriate notes could be added to those variables’ documentation now though.
Posting this here for visibility. If using ANDROID_CPP_FEATURES
to control whether to use rtti and/or exceptions, please be aware of the following bug present in NDK r23 (also still present in NDK r24-beta1):
That bug means the default value of CMAKE_ANDROID_EXCEPTIONS
is always determined by the choice of STL, which for the two main ones still supported by NDK r23 (c++_shared
and c++_static
) means exceptions will be enabled.