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
コマンドを実行
自分の環境だと、以下。
  1. C:\>cd
  2. C:\cygwin\home\piroto\android-ndk-r7\samples\hello-jni
  3.  
  4. C:\cygwin\home\piroto\android-ndk-r7\samples\hello-jni>android update project -p . -s
  5. Updated local.properties
  6. Added file C:\cygwin\home\piroto\android-ndk-r7\samples\hello-jni\build.xml
  7. Added file C:\cygwin\home\piroto\android-ndk-r7\samples\hello-jni\proguard.cfg
  8. Error: The project either has no target set or the target is invalid.
  9. Please provide a --target to the 'android.bat update' command.

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

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

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

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

これを

  1. <project name="HelloJni">

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

 

3.3 環境変数の設定

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

  1. $ vim ~/.bash_profile
  2.  
  3. export NDK_ROOT=/cygdrive/c/cygwin/home/piroto/android-ndk-r7
  4. PATH=$PATH:$NDK_ROOT

で、はまりポイント2

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

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

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

 

3.4 AWK を差し替える

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

  1. $ pwd
  2. /cygdrive/c/cygwin/home/piroto/android-ndk-r7/build/awk
  3.  
  4. piroto@eisai /cygdrive/c/cygwin/home/piroto/android-ndk-r7/build/awk
  5. $ awk check-awk.awk
  6. awk: cmd. line:1: check-awk.awk
  7. awk: cmd. line:1: ^ syntax error

 

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

  1. piroto@eisai /cygdrive/c/cygwin/home/piroto/android-ndk-r7/prebuilt/windows/bin
  2. $ mv awk.exe _awk.exe
  3.  
  4. piroto@eisai /cygdrive/c/cygwin/home/piroto/android-ndk-r7/prebuilt/windows/bin
  5. $ ln -s /usr/bin/gawk ./awk.exe

ndk_eclipse02

check-awk.awk をみると、

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

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

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

なんじゃそりゃ。

3.5 ようやくビルド

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

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

成功した!

3.6 エミュレータで実行

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

ndk_eclipse03

ふぅ。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です