linuxによるAndroid開発環境を整える(NDK編)


前回でNDKの手前まで環境構築が終わったので今回はNDKに関する部分の設定を行っていきます。

スポンサーリンク

ネイティブ開発用の準備をする

NDKを用いるとC/C++で開発を行うことが出来ます。ここからはNDKをインストールして環境を整えていきます。

http://developer.android.com/tools/sdk/ndk/index.html からNDKのアーカイブをダウンロードします。
この記事を書いている時点では r8b というバージョンのものになります。

ダウンロードしたら、ホームディレクトリで展開しておきます。

環境変数を設定します。
.bashrcを開いて末尾に設定を追加します。今までの分もちょっとだけ整理してみて、以下のようになっています。

設定したら再読込を行っておきます。

eclipseを起動します。そして Sequoyahプラグイン群をインストールを行います。
より丁寧な解説は過去の記事を参考にお願いします。

以前のものはWindows環境で書かれているので、多少違うかもしれませんが大体は同じです。

Sequoyahプラグインのインストール

メニューの Help / Install New Softwareを選択して、Work Withの部分に、”http://download.eclipse.org/sequoyah/updates/2.0/”を入力します。
そのときに、”Group Items by category”のチェックを外しておきます。

現れたプラグインのリストを全てチェックを入れて、インストールを行います。インストール後には、eclipseの再起動が必要となります。

再起動したら、Preferences より Android のカテゴリを開き、”Native Development”を開きます。ここにNDKの展開先を入力する部分があるので、そこに先ほど展開したディレクトリを設定します。

動作チェック その1

新規にプロジェクトを作成して “Android Project from Existing Code” を選び、NDKのサンプル内に含まれているhello-jni からプロジェクトを作成します。

プロジェクトを右クリックして Android Tools/Add Native Support を選択します。
その後、Run as / Android Application で実行してみます。
うまく設定されていれば、C/C++のソースコードがコンパイルされ、Android端末上に Hello from JNI!の文字が表示されていることと思います。

ndk-gdbの設定など

続いてC/C++側に任意のブレークポイントを設定して使えるようにするための設定を行います。
まずDebug Configurationsを開きます。そこで C/C++Applicationを選択し、新規作成を行います。

作成した構成を選択し、画面中央部分の、”Using GDB(DSF) Create Process Launcher “の部分のリンクできる場所をクリックします。新しいウィンドウが開くので“Standard Create Process Launder”を選択します。

Mainタブの部分では、デバッグ対象の .so 名が表示されていますがこれをプロジェクトのパス内の obj/local/armeabi/app_processというパスに変更します。

Debuggerタブの部分では、Debuggerが gdb/mi になっているので、 gdbserver に変更します。
GDB debugger の部分には、android-ndkに入っていたgdbを選択させます。
linuxの場合、android-ndk-r8b/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb というファイルになります。

GDB command file の部分には後ほど作成する gdb2.setup を設定します。
これも obj/local/armeabi の中にできあがる予定となっています。

Debugger Optionsの中のConnection タブを開きます。
この中の Type を TCP に変更します。そしてPort number を 5039 に変更します。

android-ndk-r8bに含まれているndk-gdbファイルを編集します。

ファイル中で、

となっている部分を、以下のようにコメントアウトしておきます。

続いてapp_process, gdb2.setupのファイルを用意します。
まずJava側のonCreate関数でブレークポイントを設定して、デバッグ実行を行います。
このとき、ブレークポイントで停止したら、端末(Terminal)を起動します。

作業を行っているプロジェクトのディレクトリまで移動し、(jni,objディレクトリらがある場所)、そこで ndk-gdb-eclipse スクリプトを実行します。
実行後、obj/local/armeabiディレクトリに移動します。

この場所にapp_process, gdb.setupファイルが出来ていると思います。gdb.setupはコピーして中身を編集します。

gdb2.setupを開いて、末尾の “target remote :5039” を削除します。

ここまで出来たら、一度デバッグ実行を終了させておきます。

動作確認 その2

C/C++側のコードにブレークポイントを設定してみます。ここではとりあえずNewStringUTFを呼び出している部分にブレークポイントを設定します。そして以下の手順を実行します。

  1. 先ほどJava側のonCreateにブレークポイントを設定してあるので、まずここまでをデバッグ実行します。
  2. 停止したら端末で ndk-gdb-eclipse を実行します。(エラーが出るようなら –forceオプションを付けます)
  3. eclipseでDebug As/debug configurationにて、先ほど作成した構成を選択して Debugボタンを押します。先ほどはHelloJNI-NativeGDBという名前で構成を作成してあります。
  4. Java側のonCreateで停止している部分を解除し、実行を継続します。
  5. C/C++側のブレークポイントを設定してある部分でデバッガが停止することを確認します。

まとめ

ここまでの手順にてUbuntuを用いて NDK環境の C/C++ソースコードのデバッグが出来るようになりました。VMwareを用いてのLinux環境なので、Windows環境を汚さずにAndroidのネイティブ開発を行うことが出来ます。開発PCのリソースは結構高めに必要になりそうですが、開発効率という面で十分に効果を発揮してくれるものと思います。

C/C++ソースコードの警告エラー

その他、こまるようなポイントとして C/C++側のソースコードについて警告が消えてくれないことがあります。
一度ソースコードを開いてしまうとどうも駄目なようです。
そのためプロジェクトの設定で、”C/C++ General”/”Code Analysis”内のチェックボックスを全てOFFにして対処しています。
また、この後既に検知された警告エラーをDeleteで削除しています。

その後で、プロジェクトを右クリック “Clean Project”を実行し、”Build Project”を行うと、.soファイルが生成されることを確認できました。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする