Hoe kan Android NDK een andere toolchain gebruiken?

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

Ik heb een aangepaste toolchain ( linaro ) gedownload om op ARM gebaseerde Android-apps te bouwen. Hoe vertel ik de NDK om het te gebruiken? Kan ik iets in Android.mk en Application.mk definiëren of instellen waarmee ik dat kan doen? Is er een andere manier?

1 Comments
corbin 03/08/2012
Heb je dit gedaan op Ubuntu? Hoe heb je de toolchain geïnstalleerd?

3 Answers


Peter M 03/01/2013.

Zoals het andere antwoord vermeldt, worden toolchains ontdekt door ndk-build makefile-systeem in $(NDK_ROOT)/toolchains/ en kun je ideeën spiegelen die je daar ziet. Maar er zijn een paar extra concepten voor het ondersteunen van niet-Android doelplatforms die interessant zijn, hoewel ze mogelijk snel verouderd zijn omdat ndk-build expliciet andere platformen gaat ondersteunen, zoals mingw targeting win32 (of andere gcc-compilers die gericht zijn op gewone 'ol linux) .

In config.mk :

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

Dit is een belangrijke definitie, omdat je deze naam in je Application.mk kunt gebruiken om te bouwen met behulp van de toolchain voor een bepaalde ABI. Een van de voordelen van het corrumperen van het gebruik van deze definitie is dat ndk-build tegelijkertijd kan bouwen voor meerdere ABI's. Er wordt always uitgegaan dat het platform Android is, maar als je win32 op een op mingw gebaseerde toolchain wilt richten, kun je een "ABI" als x86-win32 definiëren en deze ABI vervolgens in je Application.mk gebruiken om het als een extra te selecteren doelwit via APP_ABI:= x86-win32 Dan kun je in je Android.mk bestanden de TARGET_ARCH_ABI definitie gebruiken om win32-specifieke bronnen te selecteren en paden toe te Android.mk , bijvoorbeeld:

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

Het laatste stukje is dat in setup.mk voor je toolchain, het misschien onvoldoende is om als voorbeeld naar andere toolchains te kijken, want wat setup.mk voor een bepaalde toolchain really doet, heeft prioriteit boven build-instellingen in default-build-commands.mk , dus wat je wilt doen, is dat bestand inspecteren en daarin dingen herdefiniëren die je niet leuk vindt.

In navolging van het vorige voorbeeld ondersteunt mingw de noexec-vlag in de binaire bestanden niet en kunt u deze functie verwijderen door de volgende regels toe te voegen aan 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! 

Dit is slechts een voorbeeld van de vele functies in default-build-commands.mk die mogelijk moeten worden genegeerd en het is natuurlijk belangrijk om TOOLCHAIN_NAME te geven zodat de toolchain kan worden geselecteerd via de variabele NDK_TOOLCHAIN in uw bestand Application.mk naar de ABI-methodiek die ik hierboven vermeldde.


Ian Ni-Lewis 09/12/2013.

Het NDK makefile-systeem is vrij uitbreidbaar en je kunt inderdaad een andere toolchain definiëren. Je hebt enig inzicht nodig in hoe Make werkt.

Toolchains worden ontdekt en geïnitialiseerd in build/core/init.mk regel 261 (in NDKr6 kan de regel # in toekomstige versies veranderen). De initialisatiecode zoekt naar bestanden met de naam config.mk onder $(NDK_ROOT)/toolchains/* . Dus je zult je gereedschapskist moeten toevoegen in een subdirectory onder de NDK toolchains-map, en een config.mk en setup.mk aan die subdirectory toevoegen. Kijk naar toolchains/x86-4.4.3 en toolchains/arm-linux-androideabi-4.4.3 voor voorbeelden. U zou in staat moeten zijn om de ARM-toolchain config.mk en setup.mk te knippen en te plakken als uw gereedschapskist een standaardlay-out heeft.

Nadat u een toolchain in de toolchain-directory hebt gedefinieerd, kunt u NDK_TOOLCHAIN overschakelen door de variabele NDK_TOOLCHAIN in te stellen in uw Application.mk bestand.


lily 07/31/2017.

nou, je kunt gewoon "NDK_TOOLCHAIN_VERSION = 4.9" toevoegen in je Application.mk

Related questions

Hot questions

Language

Popular Tags