http://developer.android.com/sdk/ndk/index.html
http://developer.android.com/sdk/ndk/overview.html
ndk-build
NDK r4から提供されたビルド用のシェルスクリプト。
GNU Make 3.81以上が必要になる。
Android NDK r4以前ではNDK /apps/<name>/
にプロジェクトを置いて
cd $NDK
make APP=<name>
とかだったが、NDK r5からは
cd $PROJECT
$NDK/ndk-build
で動かせる。
コマンド | 内容 |
---|---|
ndk-build | リビルド |
ndk-build clean | 生成したファイルの削除 |
ndk-build NDK_DEBUG=1 | デバッグ可能なバイナリの生成 |
ndk-build NDK_DEBUG=0 | デバッグビルドを無効=リリースビルド |
ndk-build V=1 | ビルドを実行し、ビルドコマンドを表示する |
ndk-build -B | 強制的にリビルドする |
ndk-build -B V=1 | 強制的にリビルドして、ビルドコマンドを表示する |
ndk-build NDK_LOG=1 | NDKのログを表示する(NDK自身のデバッグで使う) |
ndk-build NDK_APPLICATION_MK= |
Application.mkを指定してのビルド(NDK_APP_APPLICATION_MKはドキュメントの間違い) |
ndk-build -C |
プロジェクトのパスを指定してビルド、プロジェクトディレクトリにcdしなくてもビルドできる |
variables/macro
/ndk/docs/ANDROID-MK.htmlをまとめただけ
includeで使えるvariables
ようはmkファイルのパスが格納されている変数。なのでinclude $(CLEAR_VARS)のように使える。変数の説明というより変数が指すmkファイルの説明。
変数 | 内容 |
---|---|
CLEAR_VARS | LOCAL_XXX変数を消す |
BUILD_SHARED_LIBRARY | LOCAL_MODULE,LOCAL_SRC_FILESをもとにshard libraryをビルドする、lib$(LOCAL_MODULE).soができる |
BUILD_STATIC_LIBRARY | static libraryをビルドする、shard libraryからはLOCAL_STATIC_LIBRARIES,LOCAL_STATIC_WHOLE_LIBRARIESに指定してリンクする、lib$(LOCAL_MODULE).aができる |
PREBUILT_SHARED_LIBRARY | 配布用、ビルド高速化などで使うために事前にビルドされたshard libraryを取り込む、prebuiltするときにLOCAL_SRC_FILESにはとりこむバイナリファイルを指定する(アーキテクチャに合わせて適切なバイナリモジュールを選ぶ必要がある、TARGET_ARCH_ABIを使ってパスを指定するのが良い)。他のモジュールからはLOCAL_SHARED_LIBRARYで読み込める。ヘッダを公開するときはLOCAL_EXPORT_C_INCLUDES を使う。 |
PREBUILT_STATIC_LIBRARY | PREBUILT_SHARED_LIBRARYのstatic library版 |
TARGET_ARCH | ターゲットのCPUアーキテクチャ名 |
TARGET_PLATFORM | ターゲットのアンドロイドプラットフォーム(≒version) |
TARGET_ARCH_ABI | ターゲットのCPU+ABI |
TARGET_ABI | $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI) |
マクロ
マクロ | 内容 |
---|---|
my-dir | 最後にincludeしたmakefileが含まれるディレクトリを返す。他のmkファイルをincludeしてしまうと値が変わるのでcurrentのmakefileのディレクトリは他のファイルをincludeする前に取得する必要がある |
all-subdir-makefiles | 再帰的にサブディレクトリのAndriod.mkを検索し、リストとして返す。Include $(call all-subdir-makefiles)などで使う。 |
this-makefile | 現在のmakefileのパスを返す |
parent-makefile | includeされている親のmakefileのパスを返す |
grand-parent-makefile | 親の親のmakefileのパスを返す |
import-module | プロジェクトツリーの外にあるndkモジュールをインポートする、NDK_MODULE_PATH/ |
モジュール用(Android.mk)
変数 | 内容 |
---|---|
LOCAL_PATH | 現在のファイルがあるパス、$(CLEAR_VARS)ではクリアされない |
LOCAL_MODULE | モジュールの名前、prefixのlibは自動的につく |
LOCAL_MODULE_FILENAME | 出力する際にファイル名を明示的に指定する場合に使う |
LOCAL_SRC_FILES | ソースファイルのリスト、LOCAL_PATHからの相対パスで、/でパスを切ること\はつかうべからず |
LOCAL_CPP_EXTENSION | cppファイルの拡張子を指定する、デフォルトは”.cpp” |
LOCAL_C_INCLUDES | includeパスをリスト、NDKルートディレクトリからの相対パスになるため、場合によっては$(LOCAL_PATH)/../fooなどで絶対パスを指定する必要もある |
LOCAL_CFLAGS | 追加するC/C++のコンパイルフラグ、ただしoptimization/debugging構成レベルの設定はApplication.mkに任せるべき |
LOCAL_CXXFLAGS | 追加するLOCAL_CPPFLAGSのエイリアス |
LOCAL_CPPFLAGS | C++のコンパイルフラグ |
LOCAL_STATIC_LIBRARIES | リンクするstatic libraryのリスト |
LOCAL_SHARED_LIBRARIES | 実行時に依存するモジュールのリスト |
LOCAL_WHOLE_STATIC_LIBRARIES | リンカの–while-archiveオプション |
LOCAL_LDLIBS | 追加するリンカフラグ |
LOCAL_ALLOW_UNDEFINED_SYMBOLS | ‘true’を指定するとundefined symbolエラーを許可するようになる |
LOCAL_ARM_MODE | デフォルトは’thumb’で16bit幅の命令コード、’arm’を指定すると32bit |
LOCAL_ARM_NEON | ‘true’を指定するとARM Advanced SIMDを使える |
LOCAL_DISABLE_NO_EXECUTE | ‘true’を指定するとAndroid NDK r4で追加されたNX bitセキュリティ機能を無効にする |
LOCAL_EXPORT_CFLAGS | static/shared libraryが参照先モジュールへ追加するC/C++コンパイラフラグ |
LOCAL_EXPORT_CPPFLAGS | LOCAL_EXPORT_CFLAGSのLOCAL_CPPFLAGS版 |
LOCAL_EXPORT_C_INCLUDES | LOCAL_EXPORT_CFLAGSのLOCAL_C_INCLUDES版 |
LOCAL_EXPORT_LDLIBS | LOCAL_EXPORT_CFLAGSのLOCAL_LDLIBS版 |
LOCAL_FILTER_ASM | アセンブリファイルをフィルタするシェルコマンド |
Application.mk
アプリケーション用の設定、通常このファイルがなくてもデフォルトの設定で動く。
アプリケーションが必要とするnative module(static/shared libraries)についての設定を書くのが目的。
設定 | 内容 |
---|---|
APP_PROJECT_PATH | アプリケーションプロジェクトのルートパス、絶対パスで記述 |
APP_MODULES | NDKが自動的に参照モジュールをリストするので不要。Android.mkがLOCAL_MODULEで参照するモジュールをモジュール名をリストする |
APP_OPTIM | release/debugを設定する。デフォルトはrelease |
APP_CFLAGS | 各モジュールに対するC/C++コンパイラフラグ(android-ndk-1.5_r1ではCのみ)、パスを指定する場合はNDKルートディレクトリの相対パスになるので注意 |
APP_CXXFLAGS | APP_CPPFLAGSのエイリアス |
APP_CPPFLAGS | APP_CFLAGSのC++版。C++ファイルのみに適応するコンパイルフラグ(android-ndk-1.5_r1ではCにも適応される) |
APP_BUILD_SCRIPT | ビルドスクリプトの名前。デフォルトはAndroid.mk |
APP_ABI | Application Binary Interface。デフォルトはarmeabi |
APP_STL | C++のランタイムライブラリを指定、デフォルトはsystem, stlport_staticかstlport_sharedでSTLが使えるようになる、複数のshard libraryからSTLを使うならstlport_sharedを使うのが良いだろう、逆にひとつならstaticでlinkさせた方がサイズが小さくなる |