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

时间:2016-01-25 08:54:41

标签: android-ndk

我正构建一个包含{.1}}和armeabi的单独* .so库的胖APK。我仅使用命令行构建(即使用armeabi-v7andk-build)。有没有办法从我的C代码中检测ant当前是为ndk-build还是为armeabi构建的?最好,我希望能够在编译时检测到这一点,但如果没有其他选择,运行时的体系结构检测也就足够了。

E.g。有什么像

armeabi-v7a

在编译时检测架构?

我知道我可以在#ifdef __armeabiv7a__ ... #else ... #endif 的{​​{1}}中传递额外的编译器标志,但这些标志总是针对所有架构传递,因此它对我没有帮助。或者我是否可以在LOCAL_CFLAGS中使用标记来仅传递Android.mkAndroid.mk的特定标记?

2 个答案:

答案 0 :(得分:2)

  

我知道我可以在Android.mk中的LOCAL_CFLAGS中传递额外的编译器标志,但这些标志总是在所有架构中传递

只有在为某个ABI构建时才会阻止您设置标记:

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

答案 1 :(得分:1)

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

#if defined(__ARM_ARCH) && __ARM_ARCH >= 7

或者这个:

#ifdef __ARM_ARCH_7A__

通过迈克尔的建议在makefile中手动设置这些,你不需要跟踪那些不同的ABI宏,并且如果转移到没有&的编译器,则进入非预期情况的风险会降低。 #39; t具有相同的预定义宏(例如MSVC编译器,尽管你不会在Android上使用它)。