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

Android Native Development Toolkit

Android Native Development Toolkit(NDK)の概要について解説します。

NDKとは

Android Native Development Tools(NDK)とは、Androidアプリケーション内にC言語やC++言語でモジュールを開発するためのツールキットです。

このツールキットは、Java言語用のAndroid SDKの補完的なモジュールを作成するために使用されます。このため、このSDKだけで、Androidのアプリケーションを作成することはできません。

アプリケーションのパッケージの中には、CPUアーキテクチャ毎のモジュールが含まれます。

ndkapk.jpg

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/

  • Native Development Tools

ダウンロードした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
    • NDK開発用のHowTo
  • 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を展開したディレクトリーの下に、ソースコード開発用のディレクトリーを作成するが必要あります。

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コマンドの起動 

  • ${ndk}のトップで、「make APP=<yourapp>」を実行することで、ビルドが開始します
    • Appsディレクトリの中の<yourapp>ディレクト参照
    • Application.mkのAPP_MODULES が参照するモジュールをAPP_PROJECT_PATHに配置
      • apps/<app1>/project/libs/armeabi/lib<module1>.so
    • モジュール名は、Android.mkで定義されています。
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に書かれていること

  • コンパイルコマンドを表示:
    • make APP=<yourapp> V=1
  • すべてのソースをリビルドする:
    • make APP=<yourapp> -B
  • ソースをNDKディレクトリ以外におく:
    • ln -sでシンボリックリンクする
  • 複数のモジュール間でインクルードする:
    • -Isources/foo、または、$(LOCAL_PATH)/../foo

 ロギングライブラリを使用する

ロギングライブラリを使用するには、-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__)