2017-03-08 74 views
1

使用Android NDK我想知道在我的C++頭文件中執行預處理器代碼時哪個目標體系結構處於活動狀態。例如,我的代碼在「armeabi」與「armv7」上表現不同。

$(TARGET_ARCH)變量可以在makefile中使用,但是有沒有可以從C++頭文件中訪問的等價物?

謝謝。

+0

[本升ist](https://sourceforge.net/p/predef/wiki/Architectures/)預定義的預處理宏可能會有所幫助。 –

回答

2

除了什麼丹阿爾伯特帳後,hello-jni示例實際上已經示出了必要的ifdef用於檢測不同的ABI:

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 
+0

這似乎是Android NDK的最佳參考。 – Bungles

1

我發現下面的Wiki是用於查找內置預處理器定義非常有用:

Pre-defined Compiler Macros

向下滾動用於ARM的部分,你可以看到,ARM 7將有:

__ARM_ARCH_7__ 

或ARM 7的其他變了一把貌似這裏還有_M_ARM,這將是7對於任何變種。

另一種方式來檢查這樣的事情是轉儲所有的預定義宏,編譯器會提供像這樣的:

$ clang -dM -E - < /dev/null 

然後,您可以通過各種不同的預處理看看定義,直到你找到你正在尋找。

如果你想訪問的確切字符串,它是從TARGET_ARCH C++,你可以做你的Android.mk以下(如模塊定義的一部分):

LOCAL_CFLAGS += -DTARGET_ARCH="$(TARGET_ARCH)" 
+0

謝謝!我使用「預定義的編譯宏」頁面來獲得我目前爲止的內容 - 使用「#if defined(__i386__)」,「#elif defined(__arm__)」等。不幸的是,我使用ndk在Windows上構建-build,所以我不知道如何做上面的「clang」命令。 – Bungles

+0

我也不確定。你可以像上面那樣在NDK中運行clang(toolchains/llvm/windows-x86_64/prebuilt/bin/clang ),但我不知道Windows shell如何執行stdin重定向(''部分)。 –