Windows + Eclipse + CDT で JNI 開発環境を構築する 〜Android NDK 快適エンジニアリング〜

Windows 環境で Eclipse を使っている場合の JNI 開発環境について、Cygwin を導入した例が圧倒的に多いのですが、Cygwin という Eclipse と非統合な別環境を導入することで開発容易性が損なわれる。またポピュラーで JNI な OSS プロダクトのいくつかは Cygwin の導入を推奨していないものがある。など Cygwin を導入することで嬉しいことが見つけられないので、Cygwin を使わない環境構築手順を紹介してみたいと思います。

尚、以下の環境を前提に説明して参ります。

  • Windows7
  • Eclipse 最新版 ... 執筆時点での最新版は 4.2 (Juno)
  • JDK6 の最新版 ... JDK7 は Android 開発時は面倒事が増えるので JDK6 をマストで使って下さい。
  • ADT (Android Development Tools) プラグインの最新版 ... 執筆時点での最新版は 20.0.2

Windows 環境へ NDK を導入/設定する

  • まず何はともあれ Android NDK のサイト から最新版の NDK をダウンロード・解凍して、空白を含まない名前の場所へ配置します。
  • 次に NDK を配置した場所を Windows環境変数として設定してます。

Eclipse の ADT (Android Development Tools) プラグインへ NDK を設定する

  • Eclipse を起動します。
  • Eclipse の設定画面を開いて Android NDK の場所を設定します。


Eclipse へ CDT (C/C++ Development Tooling) を導入する

  • サブタイトルのまんまですが Eclipse のインストールダイアログを起動して CDT (C/C++ Development Tooling) をインストールします。CDT を有効にするために Eclipse の再起動をたずねられるので再起動します。

ここまでで Windows + Eclipse 環境での下準備は完了です。続いて Eclipse 上の Android プロジェクトへコンパイル設定を紹介して参ります。

Android プロジェクトへ JNI 設定を追加する下準備

  • Eclipse 上で JNI 開発したい Android プロジェクトを選択して右クリックします。
  • コンテキストメニューから [新規]-[その他] を選択して [新規]ウィザードダイアログを起動します。

  • "C/C++" から "C/C++ プロジェクトへ変換 (C/C++ ネーチャーを追加)" を選択して[次へ]をクリックします。
  • プロジェクトオプションのツールチェインが "-- 他のツールチェイン --" となっていることを確認して[完了]をクリックします。(Android GCC ツールチェインだとビルド時にシェルを叩きに行ってエラーとなるので今回は出番なしです)


Android プロジェクトへ JNI 設定を追加する

  • 先程選択した Android プロジェクト直下へ "jni" という名称のフォルダを作成します。(C/C++ ソースや make ファイルなど一式ここに置くことになります)
  • 再度 Android プロジェクトを右クリックして今度はプロジェクトのプロパティダイアログを表示させます。
  • "C/C++ ビルド" の "ビルダー設定" を行います。デフォルト・ビルド・コマンドのチェックをオフにしてビルド・コマンドへ "${ANDROID_NDK_HOME}/ndk-build.cmd" を入力します。(ANDROID_NDK_HOME は最初の手順で Windows へ設定した環境変数です。変数ボタンを押下すると Eclipse が認識している環境変数の一覧が参照できます)
  • ビルド・ロケーションのビルド・ディレクトリーは JNI 開発する対象のプロジェクトを指していることを確認して下さい。多くの方は、Eclipse ワークスペース上にプロジェクトを配置していると思いますのでその場合は、"${workspace_loc:/Eclipse上でのプロジェクト名}" となっていることを確認します。

  • 次に "振る舞い" を設定します。クリーンの挙動が怪しいとの報告も巷でありますが、最近は問題なくなっているようです。インクリメンタルビルドの欄はこの例では -B でリビルドされるようにしています(ブランクでも構いません)。またファイルを保存する度にビルドが走るのがうざい場合は "リソース保管時のビルド (自動ビルド)" のチェックをオフにして下さい。

※蛇足ですが、プロジェクト名の変更をした場合にリフレッシュポリシーの内容は反映されないので、SVN などでチーム開発している場合やプロジェクト名をしばしば変更する場合はリフレッシュポリシーの設定を削るか修正する必要があります。でないとコンパイル時に謎なエラーで悩まされることでしょう。なので、僕的にはこの時点で設定を削除することを推奨。

  • 続いて "C/C++ 一般" の "パスおよびシンボル" を選択します。
  • インクルードタブの[追加]をクリックして NDK のインクルードパスを指定します。


  • gnu-libstdc++ も使用する場合は "${ANDROID_NDK_HOME}/sources/cxx-stl/gnu-libstdc++/4.6/include" もしくは "${ANDROID_NDK_HOME}/sources/cxx-stl/gnu-libstdc++/4.4.3/include" をインクルードパスへ追加して下さい。
  • 最後に "ソースロケーション" タブを選択して、先程作成した jni フォルダをソースロケーションへ加え、デフォルトのプロジェクト直下のソースロケーションを削除して[OK]します。


これで jni フォルダへ make ファイルや C/C++ ソースコードを配置することでプロジェクト実行時に自動的にビルドされ実行することが可能となりました。
それでは快適な JNI エンジニアリングライフを!