使用Android NDK我想知道在我的C++頭文件中執行預處理器代碼時哪個目標體系結構處於活動狀態。例如,我的代碼在「armeabi」與「armv7」上表現不同。
$(TARGET_ARCH)變量可以在makefile中使用,但是有沒有可以從C++頭文件中訪問的等價物?
謝謝。
使用Android NDK我想知道在我的C++頭文件中執行預處理器代碼時哪個目標體系結構處於活動狀態。例如,我的代碼在「armeabi」與「armv7」上表現不同。
$(TARGET_ARCH)變量可以在makefile中使用,但是有沒有可以從C++頭文件中訪問的等價物?
謝謝。
除了什麼丹阿爾伯特帳後,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
這似乎是Android NDK的最佳參考。 – Bungles
我發現下面的Wiki是用於查找內置預處理器定義非常有用:
向下滾動用於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)"
謝謝!我使用「預定義的編譯宏」頁面來獲得我目前爲止的內容 - 使用「#if defined(__i386__)」,「#elif defined(__arm__)」等。不幸的是,我使用ndk在Windows上構建-build,所以我不知道如何做上面的「clang」命令。 – Bungles
我也不確定。你可以像上面那樣在NDK中運行clang(toolchains/llvm/windows-x86_64/prebuilt/bin/clang ),但我不知道Windows shell如何執行stdin重定向(''部分)。 –
[本升ist](https://sourceforge.net/p/predef/wiki/Architectures/)預定義的預處理宏可能會有所幫助。 –