Android ndk 如何从C代码中检测armeabi和armeabi-v7a

Android ndk 如何从C代码中检测armeabi和armeabi-v7a,android-ndk,Android Ndk,我正在构建一个fat APK,其中包含用于armeabi和armeabi-v7a的独立*.so lib。我只使用命令行构建(即使用ndk-build和ant)。是否有一种方法可以从我的C代码中检测ndk构建是否当前正在为armeabi或armeabi-v7a构建?最好,我希望能够在编译时检测到这一点,但如果没有其他选择,在运行时进行架构检测也就足够了 有类似的东西吗 #ifdef __armeabiv7a__ ... #else ... #endif 在编译时检测体系结构 我知道我可以在And

我正在构建一个fat APK,其中包含用于
armeabi
armeabi-v7a
的独立*.so lib。我只使用命令行构建(即使用
ndk-build
ant
)。是否有一种方法可以从我的C代码中检测
ndk构建是否当前正在为
armeabi
armeabi-v7a
构建?最好,我希望能够在编译时检测到这一点,但如果没有其他选择,在运行时进行架构检测也就足够了

有类似的东西吗

#ifdef __armeabiv7a__
...
#else
...
#endif
在编译时检测体系结构

我知道我可以在
Android.mk
中的
LOCAL\u CFLAGS
中传递额外的编译器标志,但这些标志总是为所有架构传递,因此对我没有帮助。或者,我是否可以在
Android.mk
中使用一个标签来传递
armeabi
armeabi-v7a
的特定标志

我知道我可以在Android.mk中的
LOCAL\u CFLAGS
中传递额外的编译器标志,但这些标志始终会传递给所有体系结构

没有什么可以阻止您仅在为特定ABI构建时设置标志:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
    LOCAL_CFLAGS += -DARMEABI_V7A
endif

至少gcc提供了相当多的预定义宏,可以检查这些宏,以获取有关当前ABI的信息。对于这种情况,您可以检查以下任一项:

#if defined(__ARM_ARCH) && __ARM_ARCH >= 7
或者这个:

#ifdef __ARM_ARCH_7A__

通过按照Michael的建议在makefile中手动设置这些宏,您不需要跟踪存在哪些不同的ABI宏,并且如果移动到没有相同预定义宏的编译器(例如MSVC编译器,尽管您不会在Android中使用该编译器),则进入意外情况的风险较小.

检查ndk样本
android-ndk-r10e\samples\hello jni\jni\hello jni.c
,检测到所有受支持的ABI