[[ワーキンググループ/ハンズオンセッション]] * 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__) ---- プレゼンテーション資料は、以下からダウンロードできます。 #ref(AndroidNDK.pdf)