Comment dire à Android NDK d'utiliser une chaîne d'outils différente

Phonon 09/02/2017. 3 answers, 18.326 views
android android android-ndk android-ndk toolchain

J'ai téléchargé un toolchain personnalisé ( linaro ) pour construire des applications Android basées sur ARM. Comment puis-je dire au NDK de l'utiliser? Puis-je définir ou définir quelque chose dans Android.mk et Application.mk qui me permettrait de faire cela? Y a-t-il un autre moyen?

1 Comments
corbin 03/08/2012
Avez-vous fait cela sur Ubuntu? Comment avez-vous installé la chaîne d'outils?

3 Answers


Peter M 03/01/2013.

Comme l'indique l'autre réponse, les chaînes d'outils sont découvertes par le système nfk-build makefile dans $(NDK_ROOT)/toolchains/ et vous pouvez refléter les idées que vous voyez là. Mais il existe quelques concepts supplémentaires pour supporter les plates-formes cibles non-Android qui sont intéressantes bien qu'elles puissent être bientôt obsolètes car ndk-build commence à supporter explicitement d'autres plateformes, telles que le ciblage mingw win32 (ou d'autres compilateurs gcc ciblant tout Linux) .

Dans config.mk :

TOOLCHAIN_ABIS := (list of ABIs that the toolchain supports) 

C'est une définition importante, car vous pouvez utiliser ce nom dans votre Application.mk pour construire en utilisant la chaîne d'outils pour un ABI particulier. L'un des avantages de corrompre l'utilisation de cette définition est que ndk-build peut générer simultanément plusieurs ABI. Il suppose always que la plate-forme est Android, mais si vous souhaitez cibler win32 à l'aide d'une chaîne d'outils basée sur mingw, vous pouvez définir un "ABI" comme x86-win32 , puis utiliser cette ABI dans votre Application.mk pour le sélectionner comme cible via APP_ABI:= x86-win32 Ensuite, dans vos fichiers Android.mk , vous pouvez utiliser la définition TARGET_ARCH_ABI pour sélectionner des sources spécifiques à win32 et inclure des chemins, par exemple:

ifeq ($(TARGET_ARCH_ABI),x86-win32)
  LOCAL_SRC_FILES += my_win32_file.c
  LOCAL_CFLAGS += -DSOME_WIN32_SPECIFIC
endif 

Le dernier élément est celui de setup.mk pour votre chaîne d'outils, il peut être insuffisant de regarder d'autres chaînes d'outils par exemple, car ce que setup.mk pour une chaîne d'outils particulière remplace les paramètres de construction dans default-build-commands.mk , donc ce que vous voulez faire, c'est inspecter ce fichier, et redéfinir les choses que vous n'aimez pas.

Suivant l'exemple précédent, mingw ne supporte pas le drapeau noexec dans les binaires, et vous pouvez vous débarrasser de cette fonctionnalité en ajoutant les lignes suivantes dans votre setup.mk :

# These flags are used to enforce the NX (no execute) security feature in the
# generated machine code. This adds a special section to the generated shared
# libraries that instruct the Linux kernel to disable code execution from
# the stack and the heap.
TARGET_NO_EXECUTE_CFLAGS  := # our platform doesn't support this flag!
TARGET_NO_EXECUTE_LDFLAGS := # our platform doesn't support this flag!

# These flags disable the above security feature
TARGET_DISABLE_NO_EXECUTE_CFLAGS  :=  # our platform doesn't support this flag!
TARGET_DISABLE_NO_EXECUTE_LDFLAGS :=  # our platform doesn't support this flag! 

Ceci est juste un exemple des nombreuses fonctionnalités de default-build-commands.mk qui peuvent avoir besoin d'être remplacées, et bien sûr il est important de fournir TOOLCHAIN_NAME afin que la chaîne d'outils puisse être sélectionnée via la variable NDK_TOOLCHAIN dans votre fichier Application.mk en plus à la méthodologie ABI que je mentionne ci-dessus.


Ian Ni-Lewis 09/12/2013.

Le système makefile NDK est assez extensible et vous pouvez en effet définir une chaîne d'outils différente. Vous aurez besoin de comprendre comment fonctionne Make.

Les chaînes d'outils sont découvertes et initialisées dans la ligne 261 de build/core/init.mk (dans NDKr6, la ligne # peut changer dans les futures versions). Le code d'initialisation recherche les fichiers nommés config.mk sous $(NDK_ROOT)/toolchains/* . Vous devrez donc ajouter votre toolchain dans un sous-répertoire du répertoire des chaînes d'outils NDK et ajouter un config.mk et setup.mk dans ce sous-répertoire. Regardez toolchains/x86-4.4.3 et toolchains/arm-linux-androideabi-4.4.3 pour des exemples. Vous devriez pouvoir couper et coller la chaîne d'outils ARM config.mk et setup.mk si votre toolchain a une disposition standard.

Une fois que vous avez défini un toolchain dans le répertoire toolchain, vous pouvez y NDK_TOOLCHAIN en définissant la variable NDK_TOOLCHAIN dans votre fichier Application.mk .


lily 07/31/2017.

Eh bien, vous pouvez simplement ajouter "NDK_TOOLCHAIN_VERSION = 4.9" dans votre Application.mk

Related questions

Hot questions

Language

Popular Tags