DS-5 CEでJNIを使ったJavaとNativeの混合デバッグ
基本的にはオフィシャルサイトの記事に沿っていきますが、本サイトはAndroid ADT Bundle(ADT-21.0.x)にDS-5 CEをインストールしている事と、JNIからのファンクション呼び出し、それに伴うJavaとNativeコードの混合デバッグを行い、その点を捕捉しながら解説していきます。
2013.01.31 実機デバッグに関して追記
JNIを使用したソースコードレベルのデバッグは他のサイトでも色々試行錯誤していますが、結論から言うと、ADTのデフォルトのデバッガとDS-5のデバッガを両方駆使して行う事になります。
javaコードでデバッグするときと同様にデバッグを開始し、javaレベルのブレイクポイントで止めておき、DS-5のデバッガを接続させるという手順を踏みます。試行錯誤している最中ですが、JNIをデバッグできて、eclipse上で手軽に設定が進められるのは、この方法しかないように思います。
まずアプリケーションをデバッグ可能にするためにManifestファイルのApplicationタブからDebuggableをtrueに設定します。これでパッケージを作成する際にgdbserverが組み込まれ、詳細なデバッグが可能となります。
順番は前後しても構いませんが、続いてndkのビルドコマンドを編集します。
プロジェクトのプロパティより、Use defaultのチェックを外して[ ndk-build NDK_DEBUG=1 ]に書き換えます。コンフィグレーションを新たに設定してもいいですが、現状の統合環境の整備具合を考えると、都度編集しても大差はないように思います。
そしてDS-5デバッグのPerspectiveを開きましょう。
初回起動では、このような構成になっています。
続いて、DS-5 CEデバッグ – ARMのデバッグ設定で解説している通り、gdbserverの更新ですが、この説明ではいったい何をどうしたら良いのか頭をひねりました。結論から言うと
このオフィシャルの動画が全て解決してくれます。(ndkとDS5のバージョンが異なるため、作業は少々変わりますが)
[ヘルプ]→[ARM Extras…]を開くとエクスプローラでDS-5のgdbserverの保存された場所の一階層上のarmフォルダが開きます。
実際にリネームを指示されているファイルは
DS-5の解説ページにはありませんが、リネーム対象はこのファイルの事です。
このファイルをndkに同梱されているものと置き換えます。スクリーンショットの様に元のファイルはgdbserver-orignalとでもして残しておきましょう。
DS-5がadb(Android Debug Bridge)を実行できるようにWindowsのシステム設定でパスを追加しておきます。これは各自の環境に応じて設定しましょう。
続いてデバッグコンフィグレーションの作成。
デバッグボタン右のメニューよりDebug Configurationsを選択し、DS-5デバッガに新しいコンフィグレーションを作成します。
この設定は各アプリケーション毎に行うため、プロジェクト名_DS-5debugという名前を付けました。任意に分かりやすい名前を付けましょう。
事前にAVD(仮想端末)を立ち上げているのでスクリーンショットでは接続が認識されています。タブ(接続、ファイル、デバッグ、(x)引数と並んでいるもの)のアイコンに罰が付いているものが設定に不足がある項目です。
設定は赤丸ととおり、起動中のアプリケーションに接続するため、[Attach to a running Android application]を選択。
ファイルタブは赤丸で示したボタンからプロジェクトを選択すれば、全ての項目がオートコンプリートで設定されます。なお、先に書いたManifestファイルで、Debuggableをtrueにしていないと、プロセスの項目以下がオートコンプリートされず、設定を完了できないので注意してください。
事前に一度アプリケーションを実行しているのでapkファイルが作られているのでこうなっていますが、デフォルトの設定でBuildではapk作成がスキップされるようになっています。Buildでパッケージを生成されるようにするには[Window]>[Preferences]でSkip pakcagingのチェックを外す必要があります。普段はチェックを入れたままにして、必要に応じて設定しましょう。
こういうのがプロジェクトコンフィグレーションで分けられるとスッキリするのですが、まだまだ発展途上という事でしょう。
あとはデバッガタブの設定で実行制御を接続のみ、ソース検索ディレクトリパスを設定すればデバッグが開始できます。
まずJavaコードレベルでJNIのファンクションがコールされる前にブレイクポイントを設定し、Android Applicationのコンフィグレーションでデバッグを開始しし
接続が完了してしばらく待つと、デバッグのツールボタンのContinueボタンがアニメーションを開始します。この状態になるとDS-5で、デバッグの操作が行えるようになります。
この状態で、ソースコードや逆アセンブリリストからブレイクポイントの設定が可能となり、
デバッグを停止[Terminate(Ctrl+F2)]させたアプリケーションはRelaunchコマンドで再度実行することが出来ます。
DS-5の方はDisconnectしてConnect to Targetで再接続すると同様に再デバッグすることが出来ます。
実機でデバッグする際はroot権限を取得できる端末でない場合はデバッグを開始する際に設定を見直しましょう。
※AVD、実機の双方のデバッグに言えることですが、応答が無い状態でデバッグの設定やスレッドの操作などを行おうとすると、eclipseがフリーズする事が結構あるので注意しましょう。
フリーズした際はタスクマネージャからadb.exeを強制停止、Androidの方のタスクも強制停止する必要があります。
ディスカッション
コメント一覧
まだ、コメントがありません