カスタム ツールチェーン ( linaro ) をダウンロードして、ARM ベースの Android アプリをビルドしました。NDK にそれを使用するように指示するにはどうすればよいですか? Android.mk と Application.mk でそれを可能にする何かを定義または設定できますか? 別の方法はありますか?
3 に答える
NDK メイクファイル システムは非常に拡張性が高く、実際に別のツールチェーンを定義できます。Make の仕組みをある程度理解する必要があります。
ツールbuild/core/init.mk
チェーンは 261 行目で検出され、初期化されます (NDKr6 では、行番号は将来のバージョンで変更される可能性があります)。初期化コードは、 のconfig.mk
下にある名前のファイルを探します$(NDK_ROOT)/toolchains/*
。そのため、ツールチェーンを NDK ツールチェーン ディレクトリの下のサブディレクトリに追加し、そのサブディレクトリに と を追加する必要があり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
ます。
他の回答が言及しているように、ツールチェーンは ndk-build makefile システムによって検出され、$(NDK_ROOT)/toolchains/
そこに表示されるアイデアをミラーリングできます。しかし、Android 以外のターゲット プラットフォームをサポートするための興味深いいくつかの追加の概念がありますが、ndk-build が他のプラットフォームを明示的にサポートし始めるとすぐに時代遅れになる可能性があります。 .
でconfig.mk
:
TOOLCHAIN_ABIS := (list of ABIs that the toolchain supports)
Application.mk でこの名前を使用して、特定の ABI のツールチェーンを使用してビルドできるため、これは重要な定義です。この定義の使用法を改悪する利点の 1 つは、ndk-build が複数の ABI に対して同時にビルドできることです。プラットフォームは常にAndroidであると想定していますが、mingw ベースのツールチェーンを使用して win32 をターゲットにする場合は、「ABI」を として定義し、x86-win32
この ABI を で使用して、ファイル の Then をApplication.mk
介して追加のターゲットとして選択できます。定義を使用して、win32 固有のソースを選択し、パスを含めることができます。次に例を示します。APP_ABI:= x86-win32
Android.mk
TARGET_ARCH_ABI
ifeq ($(TARGET_ARCH_ABI),x86-win32)
LOCAL_SRC_FILES += my_win32_file.c
LOCAL_CFLAGS += -DSOME_WIN32_SPECIFIC
endif
最後の部分は、ツールチェーンの場合、他のツールチェーンを例として見るだけではsetup.mk
不十分な場合があるということですsetup.mk
.その中であなたは好きではありません。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
これは、オーバーライドが必要になる可能性があるの多くの機能の一例にすぎません。もちろん、上記の ABI 方法論に加えて、ファイル内の変数をTOOLCHAIN_NAME
介してツールチェーンを選択できるようにすることが重要です。NDK_TOOLCHAIN
Application.mk