[[ワーキンググループ/ハンズオンセッション]]

* 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__)