ワーキンググループ/ハンズオンセッション
Android Native Development Toolkit †
Android Native Development Toolkit(NDK)の概要について解説します。
NDKとは †
Android Native Development Tools(NDK)とは、Androidアプリケーション内にC言語やC++言語でモジュールを開発するためのツールキットです。
このツールキットは、Java言語用のAndroid SDKの補完的なモジュールを作成するために使用されます。このため、このSDKだけで、Androidのアプリケーションを作成することはできません。
アプリケーションのパッケージの中には、CPUアーキテクチャ毎のモジュールが含まれます。
NDKの用途と注意事項 †
NDKは、通常、以下のような用途のために使用します。
- 既存のC言語のライブラリの活用
- NativeのCPUでダイレクトに実行することによるパフォーマンスの改善
また、以下のような点に注意する必要があります。
- NDKで作成されるモジュールは、Java言語で作成されるアプリの一部分です。NDKのC言語だけでアプリケーションが開発できるわけではありません
- パフォーマンス改善のためには、JNIのオーバーヘッドの考慮が必要です
- このツールキットで作成されたモジュールは、実行される端末のCPUごとに作成することが必要がです。現状サポートされているCPUアーキテクチャは、ARMv5TEのみです。
- 現状では、libc, libm, loggingなどの、プリミティブなライブラリだけが使用できる
NDKに含まれるもの †
NDKは、Android DevelopersのSDKのページのNative Development Toolsからダウンロードできます。
http://developer.android.com/sdk/
ダウンロードしたNDKには、以下のようなツールやドキュメントが含まれています。
- C言語、C++言語のソースコードのコンパイラやビルドツール
- コンパイルしたモジュール(.soファイル)をアプリケーションパッケージファイル(.apkファイル)に配置するためのツール
- ネイティブコード用のC言語のヘッダーファイルと、ライブラリ
- ドキュメントとサンプルコード
添付されているドキュメント †
ダウンロードしたNDKのdocsディレクトリには、以下のようなドキュメントが含まれています。
- INSTALL.TXT
- OVERVIEW.TXT
- ANDROID-MK.TXT
- C,C++用のMakefileの元になる情報(Android.mk)の記述方法
- APPLICATION-MK.TXT
- Java用のアプリケーションのMakefileの元になる情報(Application.mk)の記述方法
- HOWTO.TXT
- SYSTEM-ISSUES.TXT
- STABLE-APIS.TXT
使用できるライブラリ †
将来に互換性を確保するためには、STABLE-APIS.TXTにかかれたライブラリだけをリンクする必要があります。
- libc (C library) docs/system/libc/OVERVIEW.TXTに解説あり
- libm (math library)
- JNI interface headers
- libz (Zlib compression)
- liblog (Android logging)
- 最小限のC++(<cstddef><new><utility><stl_pair.h>)
将来的には、後方互換性を確保できたものから追加されていく予定です。
NDKが動く環境 †
現在、以下のホスト環境がサポートされています。
- Windows XP (32-bit) or Vista (32- or 64-bit)
- Windowsの場合には、Cygwinのgmake, gccが必要
- Mac OS X 10.4.8 or later (x86 only)
- Linux (32- or 64-bit, tested on Linux Ubuntu Dapper Drake)
インストール方法 †
- ダウンロードしたNDKを展開します
- Windowsの場合、空白の入っていないディレクトリの使用がお勧め
- build/host-setup.shで、ツール類のセットアップを行う
- Windowsの場合、sh build/host-setup.shで起動する
- out/host/config.mkが作成される
開発用のディレクトリ †
インクルードするヘッダーファイルや、作成したモジュール用のapkファイルを作成するために、NDKを展開したディレクトリーの下に、ソースコード開発用のディレクトリーを作成するが必要あります。
${ndk}
-apps アプリケーション用のディレクトリ
-app1/Application.mk この中でJavaのプロジェクトのディレクトリを指定
project Javaのプロジェクト(別のディレクトリも可)
-app2/Application.mk 同上
-sources このディレクトリのひとつ下のAndroid.mkがターゲットになる。
-module1/Android.mk C/C++のソースコードを配置
module1.c
module1.cpp (C++のサフィックスのデフォルトはcpp)
-module2/Android.mk
module2.c
makeコマンドの起動 †
- ${ndk}のトップで、「make APP=<yourapp>」を実行することで、ビルドが開始します
- Appsディレクトリの中の<yourapp>ディレクト参照
- Application.mkのAPP_MODULES が参照するモジュールをAPP_PROJECT_PATHに配置
- apps/<app1>/project/libs/armeabi/lib<module1>.so
- モジュール名は、Android.mkで定義されています。
Eclipseでプロジェクトを開いて、プロジェクトを実行することで、.soが含まれたapkファイルが作成されます。
HOW TOに書かれていること †
- コンパイルコマンドを表示:
- すべてのソースをリビルドする:
- ソースをNDKディレクトリ以外におく:
- 複数のモジュール間でインクルードする:
- -Isources/foo、または、$(LOCAL_PATH)/../foo
ロギングライブラリを使用する †
ロギングライブラリを使用するには、-lでライブラリのリンクを指定します。
- Android.mkに、ライブラリへのリンクを追加
- ドキュメントには、-L${SYSROOT}/usr/libの記述はないが、必要。(Win, Macの場合)
LOCAL_LDLIBS := -L${SYSROOT}/usr/lib ?llog