如何从C ++文件访问$(TARGET_ARCH)?

时间:2017-03-08 23:31:30

标签: android c++ android-ndk

使用Android NDK我想知道在我的C ++头文件中执行预处理器代码时哪个目标架构是活动的。例如,我的代码在“armeabi”与“armv7”上的行为会有所不同。

$(TARGET_ARCH)变量可以在makefile中使用,但是有一个可以在C ++头文件中访问的等价物吗?

感谢。

2 个答案:

答案 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对查找内置预处理器定义非常有用:

Pre-defined Compiler Macros

向下滚动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)"