You definitely need -D__ANDROID_API__=21 in CPPFLAGS to match your minSdkVersion 21. It's broken overall, but you only happen to be seeing it when _FORTIFY_SOURCE is used because _FORTIFY_SOURCE will automatically use the new symbols introduced for newly fortified functions.
Conversation
If you run `CPPFLAGS=-D__ANDROID_API__=21 cmake` instead of `cmake`, that may work properly.
I don't understand why it would ever be not enabling _FORTIFY_SOURCE=2 by default unless it's building those files without optimization. It's generally passed by default everywhere.
2
As an interesting fact, I am (as noted I am getting used to a new version of the build process) not sure if I am building debug or release. Possibly I am building both at once, or neither.
1
It *sounds* like it might be optimizing some files (where it would pass -D_FORTIFY_SOURCE=2 by default) and not others. The _FORTIFY_SOURCE thing is just what let you know it's broken though. Real issue is not having minSdkVersion set for C and C++ so it's defaulting to 30+.
1
Okay so check this out, if I manually set the __ANDROID_API__ it says I defined it twice. Could --target=aarch64-none-linux-android26 be doing something magic?
1
You probably just need to set --target=aarch64-none-linux-android21 rather than --target=aarch64-none-linux-android26. It's the minSdkVersion that needs to be set at compile time for __ANDROID_API__ rather than the targetSdkVersion which is checked at runtime.
1
Since your code needs to link properly in an Android API 21 environment since minSdkVersion is 21. Stuff that varies based on targetSdkVersion has to be handled at runtime.
1
So, I believe what is controlling this is -D ANDROID_NATIVE_API_LEVEL=26 , which is being passed to CMake (not clang) and is most likely being interpreted by the CMake toolchain file (script). Problem: If I set this to 21, I get this legitimate-looking error:
1
This is what the hardware vendor explicitly recommends when using their gradle-based build… I guess I'll try bumping to 23.
1
I guess part of the problem is
gradle/AndroidManifest.xml refer to these three things as minSdkVersion/targetSdkVersion/compileSdkVersion,
CLANG refers to them as __ANDROID__API__/__ANDROID_API_FUTURE__/?,
and CMake refers to them as ANDROID_NATIVE_API_LEVEL/?/?
2
targetSdkVersion is android_get_application_target_sdk_version() since it varies based on the actual target and targetSdkVersion is the maximum value it can have rather than the actual value.
__ANDROID_API_FUTURE__ is really just a placeholder for "max possible version".
I screwed up one of my previous tweets about that from desktop Linux copy paste not working properly.

