Standalone ToolchainでHello World (NDK)

Ubuntu(32-bit) + NDK(r8e,release8e)の環境で確認しています*1

  • 注意1:
    Cygwin(Windows)の環境ではうまくいかない場合があります。どうもconfigureが作成するシンボリックリンクをWindows側のToolchain(NDKはMinGWベースらしい)が解釈出来ないのが原因のようです。Toolchain一式をCygwin環境下でmakeすれば解決するのかもしれませんが、そんな手間を掛けるのならLinux環境下でmakeする方が余程手っ取り早い気がします。今回、途中までCygwin環境下でmakeしていたのですが、途中からUbuntuでmakeしなおしています。
  • 注意2:
    r8eからWindows 64-bit環境用のNDKだとCygwinが予想通りには動作してくれないかもしれません。Cygwin自体はx86環境で動作しているのが原因ではないかと疑っています。今回のr8eからx86とx64版を分けて配布し始めているのも気になるところです。ndk-build.cmdと併用することを考えると嫌な予感しかしません。

1. NDKのdocument「Android NDK Dev Guide」を一読する

アップデートの度に記述が変わっていたり追加されていたりするので毎回確認は必要です。今回は「Standalone Toolchain」の章が必須。

2. NDKを$HOME下に展開する

今回は「$HOME/ndk」に展開しました。後、環境変数の設定。

export NDK_ROOT=$HOME/ndk

3. Standalone Toolchainの作成

もうイキナリ作りますか。

$NDK_ROOT/build/tools/make-standalone-toolchain.sh

実行すると /tmp下にtoolchainのパッケージが作られます。何もパラメータを設定しないとplatformを「android-3」、toolchainを「arm-linux-androideabi-4.6」で作られるようです。イマイチですね。

  • platformは「android-9」
    今回はx86、mipsとの併用を希望しているのでAPI Levelsは9以上が必須になります。最近の機能を使うならAPI Levelsは8以上がお勧め。API Levels 9以上となると次は「android-14」(Android 4.0)とかなり飛躍します。
  • toolchainは「arm-linux-androideabi-4.6」
    今回は対象がARMなのでこれでOK。n8dのToolchainのデフォルトのまま使用。
  • インストール先は「$HOME/arm-linux-androideabi-4.6」
    特にパッケージにされても嬉しくもないのでとっとと展開してしまいます。

上記を踏まえた設定を作り直すと以下の通りになります。

$NDK_ROOT/build/tools/make-standalone-toolchain.sh --platform=android-9 --toolchain=arm-linux-androideabi-4.6 --install-dir=$HOME/arm-linux-androideabi-4.6

$HOME下に「arm-linux-androideabi-4.6」というディレクトリーは出来たでしょうか。ついでに環境変数も設定しましょう。

export NDK_ARM46=$HOME/arm-linux-androideabi-4.6
export SYSROOT=$NDK_ARM46/sysroot
export PATH=$NDK_ARM46/bin:$PATH
export CC=arm-linux-androideabi-gcc
export CXX=arm-linux-androideabi-g++

もちろん上記はバッチ処理で纏めてもいいんよ?

4. GNU Helloの展開

Hello Worldと言ったらGNU Hello。

5. configureの実行

取り合えずイキナリ作りますか。

cd $HOME/hello-2.8
./configure --build=i686-pc-linux-gnu --host=arm-linux-androideabi --with-sysroot=$SYSROOT

buildパラメータは、何か設定しないと起こられるので適当に設定した。Ubuntuだと「i686-pc-linux-gnu」、Cygwinだと「i686-pc-cygwin」。hostパラメータは、殆どの場合「arm-linux-androideabi」がデフォルトになると思う。

古いautoconfで作られた設定だとAndroidの設定(arm-linux-androideabi)を知らない場合がある。ググるとconfig.subあたりを新しいのに置き換えるテクが多かったのだが「autoreconf」コマンドを使った方が近未来的だ。

以下のコマンドでconfigureが最新のものに上書きされる。

autoreconf -ivf

6. make & make install

make
make install DESTDIR=$HOME/armeabi

7. 実機での実行

/armeabi/usr/local/bin/に「hello」という実行ファイルがあれば概ね成功。このファイルを実機で動作確認します。

デバッグ接続した端末に実行ファイルをコピーします。

adb push ~/armeabi/usr/local/bin/hello /data/local/tmp

即実行。

adb shell /data/local/tmp/hello

「Hello, world!」と表示されれば私と同じ。

もしかして/data/local/tmp下が見えない機種があるかも。実行権限が無い場合にはchmodあたりで付加するといい。

Key : NDK


*1 実はr8dで書き溜めていたネタを再試したら動かなくなっていたりしてまして。流石NDK、更新されるたびに環境が変わるorz

Last-modified: 2013.04.06 (土) 22:54:35 (4202d)