web-dev-qa-db-ja.com

Android NDKに別のツールチェーンを使用するように指示する方法

カスタムツールチェーン( linaro )をダウンロードしてARM based Androidアプリをビルドしました。NDKに使用するように指示するにはどうすればよいですか。 Android.mkとApplication.mkでそれを可能にする何かを定義または設定できますか?別の方法はありますか?

23
Phonon

他の回答が述べているように、ツールチェーンは$(NDK_ROOT)/toolchains/のndk-buildmakefileシステムによって検出され、そこで見たアイデアをミラーリングできます。ただし、Android以外のターゲットプラットフォームをサポートするためのいくつかの追加の概念がありますが、ndk-buildがwin32をターゲットとするmingw(またはプレーンな 'ol linuxをターゲットとする他のgccコンパイラ)などの他のプラットフォームを明示的にサポートし始めると、すぐに時代遅れになる可能性があります。 。

_config.mk_:

_TOOLCHAIN_ABIS := (list of ABIs that the toolchain supports)
_

Application.mkでこの名前を使用して、特定のABIのツールチェーンを使用してビルドできるため、これは重要な定義です。この定義の使用法を損なうことの利点の1つは、ndk-buildが複数のABIに対して同時にビルドできることです。 常にプラットフォームがAndroidであると想定していますが、mingwベースのツールチェーンを使用してwin32をターゲットにする場合は、「ABI」を_x86-win32_として定義してから、 _Application.mk_でこのABIを使用して、_APP_ABI:= x86-win32_を介して追加のターゲットとして選択します。次に、_Android.mk_ファイルで、_TARGET_Arch_ABI_定義を使用してwin32固有のソースを選択し、パスを含めることができます。 、 例えば:

_ifeq ($(TARGET_Arch_ABI),x86-win32)
  LOCAL_SRC_FILES += my_win32_file.c
  LOCAL_CFLAGS += -DSOME_WIN32_SPECIFIC
endif
_

最後に、ツールチェーンの_setup.mk_では、他のツールチェーンを例として見るだけでは不十分な場合があります。これは、特定のツールチェーンの_setup.mk_が本当にdoesは、_default-build-commands.mk_のビルド設定をオーバーライドするため、そのファイルを検査して、不要なものを再定義します。

前の例に従って、mingwはバイナリのnoexecフラグをサポートしていません。この機能を取り除くには、_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!
_

これは、オーバーライドする必要がある_default-build-commands.mk_の多くの機能のほんの一例です。もちろん、ツールチェーンを_TOOLCHAIN_NAME_変数で選択できるように_NDK_TOOLCHAIN_を提供することが重要です。上記のABI方法論に加えて、_Application.mk_ファイル。

8
Peter M

NDK makefileシステムは非常に拡張可能であり、実際に別のツールチェーンを定義できます。 Makeがどのように機能するかをある程度理解する必要があります。

ツールチェーンは、_build/core/init.mk_行261で検出および初期化されます(NDKr6では、行番号は将来のバージョンで変更される可能性があります)。初期化コードは、$(NDK_ROOT)/toolchains/*の下で_config.mk_という名前のファイルを探します。そのため、NDK toolchainsディレクトリの下のサブディレクトリにツールチェーンを追加し、そのサブディレクトリに_config.mk_と_setup.mk_を追加する必要があります。例については、_toolchains/x86-4.4.3_および_toolchains/arm-linux-androideabi-4.4.3_を参照してください。ツールチェーンに標準のレイアウトがある場合は、ARMツールチェーン_config.mk_および_setup.mk_をカットアンドペーストできるはずです。

ツールチェーンディレクトリでツールチェーンを定義したら、_NDK_TOOLCHAIN_ファイル内の_Application.mk_変数を設定することでツールチェーンに切り替えることができます。

10
Ian Ni-Lewis

そうですね、Application.mkに「NDK_TOOLCHAIN_VERSION = 4.9」を追加するだけです。

0
lily