63 votes

Comment détecter la compilation par Android NDK dans un fichier C/C++?

Y a-t-il une macro de préprocesseur qui me permettra de savoir si NDK compile mon code? Je pourrais définir manuellement la mienne, mais je préférerais éviter si possible.

97voto

chvor Points 304

C'est #ifdef __ANDROID__ tel que vu en exécutant le préprocesseur :

~$ /usr/local/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc -E -dM - < /dev/null | grep -i android

La sortie est :

#define __ANDROID__ 1

Vous n'avez pas besoin de dépendre de la définition des éléments dans votre projet, surtout si vous sautez le système de construction NDK.

7 votes

Merci. __ANDROID__ semble être la réponse officielle: markmail.org/message/…

1 votes

Oui. Au fait, voici une URL officielle groups.google.com/forum/#!topic/android-ndk/cf9_f1SLXls

16voto

jww Points 9514

Ceci est une réponse tardive, mais pour plus de complétude, voici les définitions du préprocesseur pour android-eabi avant d’inclure des fichiers d’en-tête. Un en-tête C++ en amènera bien d'autres.

La sortie ci-dessous provient de Détection d’Android dans les fichiers source C/C++ (Macros du préprocesseur) (vers 2013) sur la liste de diffusion Android NDK. Notez que __ANDROID__ est défini, mais pas __android__ ou ANDROID.

$ arm-linux-androideabi-cpp -dM < /dev/null | sort
#define __ANDROID__ 1
#define __APCS_32__ 1
#define __ARMEL__ 1
#define __ARM_ARCH_5TE__ 1
…
#define __WINT_TYPE__ unsigned int
#define __arm__ 1
#define __linux 1
…

13voto

Martin Stone Points 5779

Réponse courte: #ifdef ANDROID.

La macro ANDROID est définie pour vous dans build-module.mk (partie du système de construction standard):

# toujours définir ANDROID lors de la construction de binaires
#
LOCAL_CFLAGS := -DANDROID $(LOCAL_CFLAGS)

1 votes

Merci pour la réponse, mais cela consiste à définir votre propre macro. Je le fais déjà de cette façon, mais ce serait mieux d'avoir une macro standard.

1 votes

Ce code se trouve dans le système de build standard Android, il s'agit donc d'une macro standard.

0 votes

Merci. Désolé d'être un peu lent :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X