AndroidStudio をインストールして、サンプルプログラムの動作を確認することができたので、
今回はデバッグ事情について調べてみました。
状況説明
従来(eclipse)時代
今までは Java 側を eclipse でデバッグして、ネイティブ C++ 側を gdb でデバッグするという方法で開発できました。
設定が大変ですが、それを行えば eclipse 上で C++ のデバッグを行うこともできました。
あるいはサードパーティー製のプラグインを使うとかでいくつか方法がありました。
AndroidStudio の今まではネイティブ側のことが考慮されていないようで、まともに使えなかったようです
AndroidStudio 2.2時代
AndroidStudio でもようやくネイティブ C++ がサポートされたものになります。
一応ウリとして、 Java + C++Native 混在デバッグができるようになったと聞きました。
今回はこれを手元の環境で確認してみたいと思います。
混在デバッグ
Java, C++ の混在デバッグの動作を確認してみることにしました。
以前に使用した HelloGL2 のプロジェクトを使用して確認したいと思います。
以下のように Java, C++ それぞれのソースコードについてブレークポイントを設定してみました。
またデバッグの対象は実機 Galaxy S2 (Android 6.0) を用いています。
この状態でデバッグを開始してみます (Shift+F9)。
すると Java 側のコードで停止しました。変数も見れているようです
続いて実行を再開して、様子を見てみます。
すぐに C++ 側のコードでも停止しました。うまくブレークポイント設定が効いているようです。
変数の値や、コールスタック情報も表示できていますし使えそうな感触です。
ここから操作を試してみましたが、ステップ実行も、ステップイン(AndroidStudio表記では Step Into) もうまく動きました。
メモリの表示とかどうしようと思いましたが、LLDB のコンソールも AndroidStudio にあったので、これで表示は一応できました。
VisualStudio のメモリ表示に比べると辛いものがありますが。
何はともあれ LLDB コンソールが用意されているのは良いポイントだなと思いました。
(XCode でも GDB コンソールのほうが自分は好きでしたし)。
ついでに条件付きブレークポイントを以下のようにして設定してみました。
この例ではこの条件付きブレークポイントも正常に動きました。
実機の問題なのかもしれませんが、このブレークポイントを設定すると非常に動作が遅くなってしまいました。
デバッグの状況によっては使用に耐えないかもと思います。
まとめ
今回、実験的に試してみた範囲ではうまく Java,C++ 両方のデバッグが可能でした。
しかも設定に色々と手間取ることもなくスムーズにできました。これは eclipse 時代と比べると大きく進化したなと感じました。
少なくとも C++ のコードも利用する Android アプリの開発をこれで開始できる、という気にはさせてくれました。
ただ未検証の部分が残っています。
- 新規にネイティブC++を含むプロジェクトを作るには?
- C++のライブラリを生成するには?
- 生成したライブラリとリンクして .so を作るには?
これらについても AndroidStudio でできるようになれば、本当に開発を AndroidStudioのみで開始できるかなと思います。
コメント
同様の設定でJavaのコードでは説明通りにbreakポイントで停止できるのですが、C++側のコード(写真と同じコード位置)でbreakポイントで止めることができませんでした。なにか特別に設定しなくてはならないことなどありますでしょうか・・・
特に設定を行ったような記憶はありません。
問題となっているのはお手元の HelloGL2 のプロジェクトでしょうか?
また、どちらの方式(Cmake, Android.mk) で起こっている問題でしょうか。
割とありそうなのが、コード類を空白や日本語を含むファイルパスに置かれているとデバッグに失敗する事例は聞きますね。