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.
Conversation
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
There's a CMake doc but it defines only ANDROID_NATIVE_API_LEVEL and not the other things.
1
ANDROID_NATIVE_API_LEVEL seems to be for minSdkVersion since minSdkVersion is the only one that's truly fixed at compile time.
targetSdkVersion is essentially the max supported API level semantics, so if you have targetSdkVersion 30 and it's Android 10 then it's 29 at runtime.
> When using the Android Gradle Plugin, this value is automatically set to match the application's minSdkVersion and should not be set manually.
That seems to be why it worked before.
2
> When invoking CMake directly, this value defaults to the lowest API level supported by the NDK in use. For example, with NDK r20 this value defaults to API level 16.
Also, you should really use compileSdkVersion 30 and the latest possible targetSdkVersion you support.
1
Show replies

