- 追加された行はこの色です。
- 削除された行はこの色です。
[[ワーキンググループ/ハンズオンセッション]]
* Android Native Development Toolkit [#yfd15062]
Android Native Development Toolkit(NDK)の概要について解説します。
** NDKとは [#i243ff68]
Android Native Development Tools(NDK)とは、Androidアプリケーション内にC言語やC++言語でモジュールを開発するためのツールキットです。
このツールキットは、Java言語用のAndroid SDKの補完的なモジュールを作成するために使用されます。このため、このSDKだけで、Androidのアプリケーションを作成することはできません。
アプリケーションのパッケージの中には、CPUアーキテクチャ毎のモジュールが含まれます。
#ref(ndkapk.jpg)
** NDKの用途と注意事項 [#ea9349de]
NDKは、通常、以下のような用途のために使用します。
- 既存のC言語のライブラリの活用
- NativeのCPUでダイレクトに実行することによるパフォーマンスの改善
また、以下のような点に注意する必要があります。
- NDKで作成されるモジュールは、Java言語で作成されるアプリの一部分です。NDKのC言語だけでアプリケーションが開発できるわけではありません
- パフォーマンス改善のためには、JNIのオーバーヘッドの考慮が必要です
- このツールキットで作成されたモジュールは、実行される端末のCPUごとに作成することが必要がです。現状サポートされているCPUアーキテクチャは、ARMv5TEのみです。
- 現状では、libc, libm, loggingなどの、プリミティブなライブラリだけが使用できる
** NDKに含まれるもの [#fccb9f0f]
NDKは、Android DevelopersのSDKのページのNative Development Toolsからダウンロードできます。
http://developer.android.com/sdk/
- Native Development Tools
ダウンロードしたNDKには、以下のようなツールやドキュメントが含まれています。
- C言語、C++言語のソースコードのコンパイラやビルドツール
- コンパイルしたモジュール(.soファイル)をアプリケーションパッケージファイル(.apkファイル)に配置するためのツール
- ネイティブコード用のC言語のヘッダーファイルと、ライブラリ
- ドキュメントとサンプルコード
**添付されているドキュメント [#k510ead6]
ダウンロードしたNDKのdocsディレクトリには、以下のようなドキュメントが含まれています。
- INSTALL.TXT
-- インストール方法。
- OVERVIEW.TXT
-- 概要
- ANDROID-MK.TXT
-- C,C++用のMakefileの元になる情報(Android.mk)の記述方法
- APPLICATION-MK.TXT
-- Java用のアプリケーションのMakefileの元になる情報(Application.mk)の記述方法
- HOWTO.TXT
-- NDK開発用のHowTo
- SYSTEM-ISSUES.TXT
-- 知の問題
- STABLE-APIS.TXT
-- 使用できるライブラリの一覧
** 使用できるライブラリ [#ue136160]
将来に互換性を確保するためには、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が動く環境 [#vab0dfd7]
現在、以下のホスト環境がサポートされています。
- 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)
**インストール方法 [#cc014764]
- ダウンロードしたNDKを展開します
-- Windowsの場合、空白の入っていないディレクトリの使用がお勧め
- build/host-setup.shで、ツール類のセットアップを行う
-- Windowsの場合、sh build/host-setup.shで起動する
-- out/host/config.mkが作成される
** 開発用のディレクトリ [#h0ca5a04]
インクルードするヘッダーファイルや、作成したモジュール用のapkファイルを作成するために、NDKを展開したディレクトリーの下に、ソースコード開発用のディレクトリーを作成するが必要あります。
#ref(directory.jpg)
${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コマンドの起動 [#w2c8068a]
- ${ndk}のトップで、「make APP=<yourapp>」を実行することで、ビルドが開始します
-- Appsディレクトリの中の<yourapp>ディレクト参照
-- Application.mkのAPP_MODULES が参照するモジュールをAPP_PROJECT_PATHに配置
--- apps/<app1>/project/libs/armeabi/lib<module1>.so
--モジュール名は、Android.mkで定義されています。
#ref(make.jpg)
Eclipseでプロジェクトを開いて、プロジェクトを実行することで、.soが含まれたapkファイルが作成されます。
- apkファイルの中身は、以下のようになっています
AndroidManifest.xml
resources.arsc
classes.dex
lib/armeabi/libhello-jni.so <= ターゲット毎に.soが作成される
META-INF/MANIFEST.MF
META-INF/CERT.SF
META-INF/CERT.RSA
** HOW TOに書かれていること [#c767b84c]
- コンパイルコマンドを表示:
-- make APP=<yourapp> V=1
- すべてのソースをリビルドする:
-- make APP=<yourapp> -B
- ソースをNDKディレクトリ以外におく:
-- ln -sでシンボリックリンクする
- 複数のモジュール間でインクルードする:
-- -Isources/foo、または、$(LOCAL_PATH)/../foo
** ロギングライブラリを使用する [#bf68f800]
ロギングライブラリを使用するには、-lでライブラリのリンクを指定します。
- Android.mkに、ライブラリへのリンクを追加
-- ドキュメントには、-L${SYSROOT}/usr/libの記述はないが、必要。(Win, Macの場合)
LOCAL_LDLIBS := -L${SYSROOT}/usr/lib ?llog
- __android_log_printで出力。
-- 通常は、以下のようなヘッダーを用意して、マクロにすると便利です。
#include <android/log.h>
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)