Androidアプリでネイティブライブラリを利用するため NDK を設定する

ちょっとやりたいことがあるので、Android NDK 環境を準備しようと思う。

Android NDK とは、Andoroid アプリケーションにネイティブコードを利用して作成されたコンポーネントを埋め込むことを可能にするツールセット。Android アプリケーションはDalvikか総マシーンで実行される。NDKは C や C++ などのネイティブコードを使った一部を実装することを可能にする。

いつものように、Android Hacks ―プロが教えるテクニック & ツール を見ながら、ちょちょいのちょいと。。。

は行かなかったので、はまった点などの手順をメモしておく。

1.Cygwinのインストール

Windows 環境でNDKを利用するには、Cygwin が必要。

http://cygwin.com/install.html

上記サイトから、Setup.exe をダウンロードしてきて、ウィザードに従いインストールする途中で、以下の様なインストールパッケージを選択する画面になるので、カテゴリーから、Devel を選択して展開し、

  • gcc
  • make

をインストールする

cygwin_inst01

辞書順にずーっとみていくと、gcc が存在するので、Skip というアイコンをクリックすると、インストール対象となる。

cygwin_inst02

同様に、make もインストールする。

cygwin_inst03

2.Android NDK のインストール

以下から、Wubdiws版をダウンロードして解凍。

http://developer.android.com/sdk/ndk/index.html

android_ndk01

置き場所は、どこでも良いようだが、Android Hacks ―プロが教えるテクニック & ツール にならい、C:\cygwin\home\{ユーザー名}\android-ndk-r7 に配置する

android_ndk02

3.サンプルの実行

http://developer.android.com/sdk/ndk/overview.html#samples

解凍、配置したNDKフォルダ直下の、samples フォルダの下に、いくつかのサンプルがあるが、それぞれ、Androidアプリケーションの構造を持っている。

  • jni ディレクトリ : Android.mk ファイルとネイティブコードのソースコードを含んでいる
  • tests ディレクトリ : ユニットテストコードを含んでいる

3.1 プロジェクトの作成

一番初歩的そうな、helo-jni を選ぶ。

  • Eclipse を立ち上げて(もちろんAndroid環境構築済み)、新規 Android プロジェクトから、Create project from existing source にチェックをONにする。
  • Location に、上記 samples/helo-jni の位置を指定。

ndk_eclipse01

3.2 ビルドファイルの作成

対象のディレクトリまでいって、

android update project -p . –s
コマンドを実行
自分の環境だと、以下。
C:\>cd 
C:\cygwin\home\piroto\android-ndk-r7\samples\hello-jni

C:\cygwin\home\piroto\android-ndk-r7\samples\hello-jni>android update project -p . -s
Updated local.properties
Added file C:\cygwin\home\piroto\android-ndk-r7\samples\hello-jni\build.xml
Added file C:\cygwin\home\piroto\android-ndk-r7\samples\hello-jni\proguard.cfg
Error: The project either has no target set or the target is invalid.
Please provide a --target to the 'android.bat update' command.

Error??? 一つ目のはまりポイント。

確かに build.xml は生成されるのだが、Ant のデフォルトターゲット が存在していない?

ここは、生成された build.xml の

<project name="HelloJni" default="help">

これを

<project name="HelloJni">

こう修正(default="help"を削除)。

 

3.3 環境変数の設定

.bash_profile  を編集する。cygwin でエディタをインストールしてなければ、C:\cygwin\home\[ユーザー名]\.bash_profile に以下の2行を追記。

$ vim ~/.bash_profile

export NDK_ROOT=/cygdrive/c/cygwin/home/piroto/android-ndk-r7
PATH=$PATH:$NDK_ROOT

で、はまりポイント2

最初、何も考えずに、NDK_HOME とかしていたが、NDK_ROOT 環境変数が設定されていないと、

以下の様に、awk が見つからないというエラーになる。また、ディレクトリ末尾の / も不要。

$ cd  /cygdrive/c/cygwin/home/piroto/android-ndk-r7/samples/hello-jni

piroto@eisai /cygdrive/c/cygwin/home/piroto/android-ndk-r7/samples/hello-jni
$ ndk-build
C:\cygwin\home\piroto\android-ndk-r7\prebuilt\windows\bin\awk.exe: can't open file /cygdrive/c/cygwi
n/home/piroto/android-ndk-r7/build/awk/check-awk.awk
 source line number 1 source file /cygdrive/c/cygwin/home/piroto/android-ndk-r7/build/awk/check-awk.
awk
 context is
         >>>  <<<
Android NDK: Host 'awk' tool is outdated. Please define HOST_AWK to point to Gawk or Nawk !
/cygdrive/c/cygwin/home/piroto/android-ndk-r7/build/core/init.mk:258: *** Android NDK: Aborting.
.  Stop.

 

3.4 AWK を差し替える

ここまでで、ndk-build を行うも、check-awk.awk でエラーが発生しているようだ。はまりポイント3。

$ pwd
/cygdrive/c/cygwin/home/piroto/android-ndk-r7/build/awk

piroto@eisai /cygdrive/c/cygwin/home/piroto/android-ndk-r7/build/awk
$ awk check-awk.awk
awk: cmd. line:1: check-awk.awk
awk: cmd. line:1:          ^ syntax error

 

先人の知恵を参考にすると、どうも、AndroidNDKに含まれている awk では問題あり?とりあえず、AndroidNDKに含まれている awk を _awk にリネームし、/usr/bin/gawk のシンボリックリンクとして awk を作成。

piroto@eisai /cygdrive/c/cygwin/home/piroto/android-ndk-r7/prebuilt/windows/bin
$ mv awk.exe _awk.exe

piroto@eisai /cygdrive/c/cygwin/home/piroto/android-ndk-r7/prebuilt/windows/bin
$ ln -s /usr/bin/gawk ./awk.exe

ndk_eclipse02

check-awk.awk をみると、

# This script is used to check that a given awk executable
# implements the match() and substr() functions appropriately.
#
# These were introduced in nawk/gawk, but the original awk
# does not have them.

nawk/gawk で導入された、match(),substr() が実装されているかチェックしているっぽい。

オリジナルの awk には含まれてませんよと。

なんじゃそりゃ。

3.5 ようやくビルド

気を取り直して、ndk-build を cygwin から実行。

piroto@eisai /cygdrive/c/cygwin/home/piroto/android-ndk-r7/samples/hello-jni
$ ndk-build
Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile thumb  : hello-jni <= hello-jni.c
SharedLibrary  : libhello-jni.so
Install        : libhello-jni.so => libs/armeabi/libhello-jni.so

成功した!

3.6 エミュレータで実行

おー Hello なんちゃらと表示されました。成功でしょう。

ndk_eclipse03

ふぅ。