Android ndk 如何从C代码中检测armeabi和armeabi-v7a
我正在构建一个fat APK,其中包含用于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
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