使用Android NDK我想知道在我的C ++头文件中执行预处理器代码时哪个目标架构是活动的。例如,我的代码在“armeabi”与“armv7”上的行为会有所不同。
$(TARGET_ARCH)变量可以在makefile中使用,但是有一个可以在C ++头文件中访问的等价物吗?
感谢。
答案 0 :(得分:4)
除了Dan Albert发布的内容之外,hello-jni
示例实际上已经显示了用于检测不同ABI的必要ifdef:
https://github.com/googlesamples/android-ndk/blob/master/hello-jni/app/src/main/cpp/hello-jni.c
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a/NEON (hard-float)"
#else
#define ABI "armeabi-v7a/NEON"
#endif
#else
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a (hard-float)"
#else
#define ABI "armeabi-v7a"
#endif
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64) /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#else
#define ABI "unknown"
#endif
答案 1 :(得分:1)
我发现下面的Wiki对查找内置预处理器定义非常有用:
向下滚动ARM部分,您可以看到ARM 7将具有:
__ARM_ARCH_7__
或ARM 7的其他一些变体。看起来还有_M_ARM
,对于任何变体都是7。
另一种检查此类事情的方法是转储编译器将提供的所有预定义宏,如下所示:
$ clang -dM -E - < /dev/null
然后,您可以查看所有不同的预处理器定义,直到找到您要查找的内容。
如果您想从C ++访问TARGET_ARCH
的确切字符串,可以在Android.mk中执行以下操作(作为模块定义的一部分):
LOCAL_CFLAGS += -DTARGET_ARCH="$(TARGET_ARCH)"