小ネタ 2010-021

Android NDKでネイティブCUIアプリを作ってみる

 キーボード付きのAndroid端末を使って、Terminalアプリ上でshellを起動して、キーボード操作で動作するアプリを動かすのを模索していた。
 最初のAndroid携帯電話を使った時( Android Dev Phone 1を使ってみる )から色々と試していて、主にネイティブのアプリを作る( Android実機上でLinuxのネイティブバイナリを動かしてみる )というのを考えていた。
 ネイティブバイナリ以外にも、スクリプト言語( SL4A )もあるのだが、できればC言語で開発をしたい。
 Android NDKがバージョンアップし、NDK r4bでネイティブアプリが作れるようになったというので試してみた。(2010-12-12)
 
 
 キーボード付きのAndroid端末 ( Android DevPhone 1, シャープIS01 , AcerのAndroid/Win7デュアルブート機 , 東芝DynabookAZ )



1. Android NDKの開発環境を準備する

 WindowsのPC上にCygwinをインストールする。
 Cygwinのサイトからインストーラーをダウンロードして実行し、インストール作業の中でコマンドDevel内のmakeとArchive内のunzipを追加でインストールした。

 次にNDKをインストールする。
 NDKのサイトからandroid-ndk-r4b.zipをダウンロードした。(現在2010-12-12は、ndk-r5がダウンロードできる。ndk-r5の場合も同様に作業する)
 次のようなコマンドで、ホームディレクトリ直下にインストールした。
 % unzip android-ndk-r4b-windows.zip -d ~/.


2. ネイティブアプリのソースと、メイクファイルと、フォルダ構成

 簡単なHello,worldのソースを試した。
 hello.cというソースファイルで、内容は次の2行のとおり。
 #include <stdio.h>
 int main(){ printf("Hello,world\n"); return 0; }

 メイクファイルは、Android.mkというファイル名で、内容は次のとおり。
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 LOCAL_MODULE := hello
 LOCAL_SRC_FILES := hello.c
 include $(BUILD_EXECUTABLE)

 ホームディレクトリ直下にhelloというフォルダを作成しておいて、その中にjniというフォルダを作成し、上記のhello.cとAndroid.mkを入れる。
 ( ~/hello/jni/hello.c と ~/hello/jni/Android.mk )

 ビルドのための手順を書いた起動用のスクリプトbuild.shというファイルを作成。内容は次の2行のとおり。
 export PATH=$PATH:~/android-ndk-r4b; export ANDROID_NDK_ROOT=~/android-ndk-r4b
 ndk-build
 やっているのは、1行目でパスを通すのと必要な環境変数を設定していて、2行目でビルドコマンドndk-buildを実行している。
 このbuild.shというファイルは~/helloフォルダに入れる。( ~/hello/build.sh )


3. ビルド

 次のコマンドでビルド用スクリプトを実行する。
 % cd ~/hello
 % sh build.sh

 手順に問題が無ければ無事にビルドが終了し、コンパイル結果のバイナリ ~/hello/obj/local/armeabi/hello が得られる。


4. 実行

 adbコマンドを使って、実機に転送する。
 % adb push hello /data/hello

 実機上で、ファイル属性に実行属性を付加する。
 % chmod 755 /data/hello

 helloアプリ実行する。
 % /data/hello
 結果、「Hello,world」と表示されるのが確認できた。

 



(後日加筆 2010-05)
 64bit版Ubuntu 10.04上で、同様のビルドを試してみた。NDKはr5bというバージョンを使った。

 ビルドのための手順を書いた起動用のスクリプトbuild.shに問題があったので修正した。
  PATH=$PATH:~/android-ndk-r5b ; export PATH
  ANDROID_NDK_ROOT=~/android-ndk-r5b ; export ANDROID_NDK_ROOT
  ndk-build

 これだけでビルドできるかと思ったら、android-ndk-r5bの中のprebuilt下に入っているビルド済みのgccなどのツールが実行できず、エラーになってしまう。
 arm-linux-androideabi-gcc: not foundなどのエラーが出るのだが、ファイルが見つからないというエラーが出てる。
 実際にこのgccの入ったフォルダに移動して、./arm-linux-androideabi-gccとして実行しようとしても、ファイルが見つからないというエラーとなる。

 64bit版Ununtuを使ったのは初めてだったので、このエラーの原因が最初は分からなかった。
 どうもこれは、実行ファイル内で使われているライブラリが見つからない場合に起きるらしい。(WindowsのDLLが見つからないというエラーと同じ?)
 対策としては、
 % sudo apt-get install ia32-libs
 というコマンドで ia32-libsというパッケージをインストールすると、必要なライブラリがインストールされる。

 これらの対策で、NDK r5bを使ってビルドすることができた。



今後の予定

 以下の参考にしたblog記事で、PCと通信したりインテントを発行するCUIアプリの例が出ている。試しに何か作ってみたい。
 ・Android NDK でネイティブ CUI プログラムを書く! - DSAS開発者の部屋 http://dsas.blog.klab.org/archives/51809744.html

 NDK-r5がリリースされ、これを使うとGUIアプリも作成できるらしい。試してみたい。
 ・Android NDK r5バージョンアップまとめ - Happy my life http://blog.cnu.jp/2010/12/07/android-ndk-r5/
 ・Android NDK rev5 (Gingerbread) の変更点まとめ - ブリリアントサービスhttp://d.hatena.ne.jp/bs-android/20101208/1291760672