2009年09月05日
Android NDKのデバッグ手法
●高度なデバッグ方法
組み込みプレスVol.16によくまとまっておりますので、こちらを参考にしてください。
を、Android NDK&Windows向けに解説してくれ、との要望がありましたので、作ってみました。
詳細は、上記の組み込みプレスVol.16を確認していただくとして、その差分を掲載させていただきます。
(とは言っても、このエントリーだけも構築はできると思いますが、何をやっているかの詳細は本書をご確認ください。。)
●Android.mkで実行ファイルを作る
まず、デバッグするために実行ファイルを作らなくてはなりません。
sharedライブラリのままでは、実行出来ませんからね。
Android上で実行可能なファイルは、Android.mkで作成可能です。
具体的には、main関数を作成の上、Android.mk内を下記のように変更するだけです。
include $(BUILD_SHARED_LIBRARY) ⇒ include $(BUILD_EXECUTABLE)
●Eclipse CDTを準備する
Eclipse CDTから、ダウンロードしてください。
Androidの開発用Eclipse に、追加インストールしても問題ありませんが、プラグインを増やすとどんどんとEclipseが重くなっていきますので、別に用意するのも手です。
●Cygwinの準備を整える
Android NDKがインストール済みであれば、下記の作業をするだけです。
・C:\cygwin\bin\cygwin1.dll を C:\Windows\System32 にコピーする
・C:\cygwin\binを、Windows の環境変数 PATH に含める
●Default Launcherを設定する
下記の通りにメニューを追って、変更してください。
Window
Preferences
Run/Debug
Launching
Default Lanchers
内の
C/C++ Application [Debug]
Preferred Launcher
を、
Standard Create Process Launcher
にする
●コンパイル用スクリプトを設定する
・「build.bat」を作成する
ただたんに、makeしただけでは、Android NDKをコンパイルすることは出来ません。Android NDKディレクトリに移動した上で、makeする必要があります。
そこで、それを行うスクリプトを作成します。
今回は、「build.bat」という名前で作成します。
set PROG=%1
cd [Android NDKへのpath]
make APP=%PROG%
・「build.bat」をEclipseに設定する
下記の通りにメニューを追って、変更してください。
Project
Properties
C/C++ Build
内の
Builder Settingsタブ
Build command
に独自バッチファイル「build.bat」を指定する。
「build.bat」は、引数として、Android.mkのモジュール名を要求しますので、それを指定します。
Behaviourタブ
Build on resource save(Auto Build)
Build(Incremental build)
に、Android.mkのモジュール名を入力する。
※ここでは、「ecTest」としてあります。
●Android NDK用のIncludeファイルがあるディレクトリを指定する
要は、bionicのIncludeファイルを指定します。
Project
Properties
C/C++ General
Paths and Symbols
内の
Includes
に、Android NDK用のIncludeファイルがあるディレクトリを「それぞれ」指定します。
android-ndk-x.x\build\platforms\android-1.5\arch-arm\usr\include
android-ndk-x.x\build\platforms\android-1.5\common\include
を追加。
Add to all configurations
Add to all languages
Is a workspace path
は、必要に応じてチェックします。
意味がわからないなら、付けてしまいましょう。
●実行用スクリプトを設定する
・「launch.bat」を作成する
Android NDKで作成した実行ファイルをAndroidエミュレータや実機で動作させるには、ちょっとした仕掛けが必要です。
そこで、実行用のスクリプトを作成します。
set PROG=%1※ /data は、Android上のディレクトリとなります。必要に応じて変更してください。 ※ Androidエミュレータや実機が接続されていないと、使用出来ません。
cd [Android NDKへのpath]
adb push [Android NDKへのpath]\out\apps\%PROG%\android-1.5-arm\%PROG% /data
adb shell chmod 777 /data/%PROG%
adb shell /data/%PROG% "$@"
・「launch.bat」を使用するように、Eclipseを設定する
下記の通りにメニューを追って、変更してください。
Run
External Tools
External Tools Configurations
選択します。
Program
に新規追加します。
独自スクリプト「launch.bat」を追加します。
Arguments
に、Android.mkのモジュール名を入力します。
●デバッグ用スクリプトを設定する
・「prepare.bat」を作成する
デバッグを行うには、gdbserver を起動する必要があります。
そこで、それを自動的に行うためのスクリプトを作成します。
set PROG=%1※ /data は、Android上のディレクトリとなります。必要に応じて変更してください。 ※ 5039ポートは、待ち受けポートとなります。必要に応じて変更してください。 ※ Androidエミュレータや実機が接続されていないと、使用出来ません。
cd [Android NDKへのpath]
adb push [Android NDKへのpath]\out\apps\%PROG%\android-1.5-arm\%PROG% /data
adb shell chmod 777 /data/%PROG%
adb forward tcp:5039 tcp:5039
adb shell gdbserver tcp:5039 /data/%PROG% "$@"
・「prepare.bat」を使用するように、Eclipseを設定する
下記の通りにメニューを追って、変更してください。
Run
External Tools
External Tools Configurations
選択します。
Program
に新規追加します。
独自スクリプト「prepare.bat」を追加します。
Arguments
に、Android.mkのモジュール名を入力します。
●gdbserverを設定する
Eclipseが利用するデバッガとして、gdbserverを利用するための設定を行います。
タブが何個かネストしておりますので、わかりにくいかもしれませんが、がんばって設定してください。
・mainの設定
Run
Run Configurations
を選択します。
C/C++ Application
に新規追加します。
Mainタブ
C/C++ Application
に「[Android NDKへのpath]\out\apps\[Android NDKモジュール名]\android-1.5-arm\[Android NDKモジュール名]」を追加します。
・Debuggerの設定
Debuggerタブ
Debugger
の設定を
gdbserver Debugger
に変更します。
Dubugger Options
の GDB debugger
に「[Android NDKへのpath]\build\prebuilt\windows\arm-eabi-4.2.1\bin\arm-eabi-gdb.exe」を追加します。
・Shared Librariesの設定
Shared Librariesタブ
に「[Android NDKへのpath]\out\apps\[Android NDKモジュール名]\android-1.5-arm」を追加します。
・Connectionの設定
Connectionタブ
Type
の設定を
TCP
に変更します。
Port number
の設定を 5039
に変更します。
●デバッグ用スクリプトをEcliseで実行可能なように設定する
いままで作ってきた各種実行用スクリプトをEclipseから実行出来るようにします。
・Eclipseのスクリプト設定画面を開く
Run
Run Configurations
選択します。
Launch Group
に、後述する2つのモノを新規追加します。
・実行用Launch Groupを登録する
[Eclipse用実行用スクリプト] mode:run
を新規追加します。
・デバッグ用Launch Groupを登録する
[Eclipse用デバッグ用スクリプト] mode:run
[Eclipse用GDB設定] mode:debug
を新規追加します。
●起動
これで、あとは、Androidのエミュレータなり、実機なりを起動して、実行すればOKです。
下記のように、main関数で停止した状態で起動します。
- by noritsuna
- at 07:57