はじめに
ここに書いてあることは、夢です。目が覚めたら、全て忘れてしまうことでしょう。動作環境
- Windows Vista Business 64bit SP2
- AMD Phenom II X4 955 3.2GHz
- Tegra Android Developer Pack 1.0r8
- Android SDK r18
- Android NDK r8
- JDK 6u24
- Cygwin 1.7
- Eclipse 3.7.1
- CDT 8.0.0
- ADT 15.0.0
- Apache Ant 1.8.2
- NVIDIA Debug Manager for Eclipse 12.0.0
- Tegra Sample Code
Standalone Toolchain
要は、configure や make を使って、Android 用にビルドを行うためのツール群。以下のように、適当なディレクトリ(ここでは、「/tmp/my-android-toolchain」ディレクトリ)に Toolchain コマンド群をインストール。--platform に指定するバージョンは、適宜変更すること。
${NDKROOT}/build/tools/make-standalone-toolchain.sh --platform=android-14 --install-dir=/tmp/my-android-toolchain
configure や make 用の設定。面倒なので、「.bashrc」で設定するようにした。
export SYSROOT=${NDKROOT}/platforms/android-14/arch-arm export PATH=/tmp/my-android-toolchain/bin:${NDKROOT}:${PATH}
ビルド
ビルド時に、よく利用する設定。ビルド対象によって、指定内容が変わるので、試行錯誤が必要。configure
CFLAGS='-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon' LDFLAGS='-Wl,--fix-cortex-a8' CC=arm-linux-androideabi-gcc LD=arm-linux-androideabi-ld ./configure --host=arm-linux-androideabi --cross-prefix=arm-linux-androideabi-「-mfpu=neon」は、Tegra3 などの NEON に対応した CPU の場合に指定する。(Tegra2 は未対応なので注意)
configure で、「--cross-prefix」が、指定できる場合、「CC」や「LD」などの指定が、不要となる。
トラブルその1
configure を実行すると$ ./configure --host=arm-linux-androideabi configure: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used checking build system type... i686-pc-cygwin checking host system type... Invalid configuration `arm-linux-androideabi': system `androideabi' not recognized configure: error: /bin/sh ./config.sub arm-linux-androideabi failedとなる場合がある、詳細は、まったく承知していないが、以下のファイルが古いため、Android 用のクロスコンパイルに対応していないことが、原因のようだ。
「config.guess」
「config.sub」
「config.sub」ファイルの中身を見てみると、7行目に「timestamp='2009-11-20'」とかあった。確かに古い。
これらのファイルを、Android 用クロスコンパイルに対応したものに、差し替えると大丈夫なようだ。
こうしてみる。えぃ!
$ autoreconf -if再びファイルを確認したら、「timestamp='2012-01-01'」となっていた。
あ、でも、当てずっぽうでやってるので、鵜呑みにしないように。
Cygwin
ホームディレクトリに「.bash_profile」および「.bashrc」ファイルを作成。改行は、unix 形式(LF)にすること。【~/.bash_profile】
if [ -f ~/.bashrc ]; then . ~/.bashrc fi
【~/.bashrc】
# global setting if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific setting export ANDROID_NDK_ROOT=`/usr/bin/cygpath ${ANDROID_NDK_ROOT}` export NDKROOT=`/usr/bin/cygpath ${NDKROOT}` export SYSROOT=${NDKROOT}/platforms/android-14/arch-arm export PATH=/tmp/my-android-toolchain/bin:${NDKROOT}:${PATH}
ndk-gdb
起動方法
ndk-gdb を PATH に追加$ export PATH=/cygdrive/e/appli/NVPACK/android-ndk-r8/:$PATH
デバック対象のプロジェクトにカレントディレクトリを移動
$ cd /cygdrive/e/work/Repositories/git/helloCollada/helloCollada/
ndk-gdb を起動
$ ndk-gdb --start
トラブルその1
ndk-gdb が、以下のように起動できない場合。awk: 致命的: ソースファイル `/cygdrive/e/work/Repositories/git/helloCollada/helloCollada/E:\appli\NVPACK\android-ndk-r8/b uild/awk/check-awk.awk' を読み込み用に開けません (No such file or directory) ERROR: Could not run '/usr/bin/awk' command. Do you have it installed properly?Cygwin 上で、ndk-gdb を起動するときには、以下のように環境変数を上書きする。以下の環境変数は、「Tegra Android Developer Pack」のインストール時に自動的に設定されるものだが、Windows 形式の PATH となっている。これを、Cygwin 形式の PATH に設定し直す。
$ export ANDROID_NDK_ROOT=`/usr/bin/cygpath ${ANDROID_NDK_ROOT}`
トラブルその2
ndk-gdb --start で起動した後、so ファイルが読み込めない場合。Error while mapping shared library sections:
libxxxx.so: No such file or directory.
その他多くの so ファイルも同様
libc.so および対象プロジェクトの so ファイルは、読み込まれないと困る。(それ以外は、読み込めなくて、問題ない)
読み込まれる定義をするファイルが、対象プロジェクトの「obj/local/armeabi[-v7a]」ディレクトリにある、「gdb.setup」ファイルとなる。これを開いて、1行目にある記述が so ファイルを読み込むディレクトリ指定。
set solib-search-path ・・・・
ただし、このファイルは、ndk-gdb 起動時に毎回自動生成されるので、これを修正してもだめ。
元となるファイルは、ビルド(ndk-build)時に作成される「libs/armeabi[-v7a]」ディレクトリの「gdb.setup」ファイル。
しかし、問題は、ディレクトリの設定ではなく、改行コード(CRとLF)が、混在していることだった。
元凶は、「gdb.setup」ファイルを生成するときに、echo コマンドを使っているのだが、Standalone Toolchain の echo を使っているらしく、こいつが悪さをするようだ。
したがって、Cygwin の echo を使うように、ビルド時のオプションに「HOST_ECHO=echo」を追加した。
${CYGWIN_HOME}/bin/bash ${NDKROOT}/ndk-build HOST_ECHO=echo NDK_DEBUG=1 V=1
これで、LF 改行のみのファイルとなった。
ndk-gdb --start で、起動したあと、(相変わらず、「libxxxx.so: No such file or directory.」が、たくさん表示されるが・・・)
(gdb) info share
とすると、libc.so と対象プロジェクトの so ファイルの「Syms Read」項目が、「Yes」になっていることで、シンボルの読み込みに、成功したことを確認できる。