本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

Androidでネイティブデバッグ(実機でデバッグも) -その1-

AndroidのC/C++を使ったネイティブコード(JNI)を、ソースコードデバッグできるように環境を整えることができました。環境にも若干左右されるようですが、概ねうまく動いてくれるようです。VisualStudio上ではなくEclipse上でではありますが、C/C++のソースコードレベルでブレークポイントを張ったり、変数を覗き見できるようになることは、開発のしやすさ向上につながると思います。

必要なもの

ここでは、Windowsでの開発環境を想定しています。以下のものがすでに整っているという前提で以降説明していきます。また、NDKのセットアップに関してはコマンドで ndk-build を実行して .so ファイルは作れる環境まで仕上がっているということを事前条件としています。

  • Eclipse
    • JavaによるAndroid開発環境が整っていること.
    • ここに、CDT, Sequoyah プラグインを入れていきます。
  • Android-SDK, NDK
  • cygwin

Eclipseの環境を準備する

EclipseでC/C++を扱うためにプラグインを導入します。
必要なプラグインは C/C++ Development Tools (CDT)です。
これは、Eclipseの [Help] => [Install New Software] と開き、”Work with”の部分に、”Indigo – http://download.eclipse.org/releases/indigo” となるように選択するか入力するかします。
すると一覧が出てくるので、ここで”C/C++ Development Tools”を選びます。
(“Group items by category”を外しておいた方が見つけやすくなるかもしれません)
チェックを入れて、このプラグインをインストールします。
インストール後には、Eclipseの再起動が必要になります。

続いて、Sequoyah プラグインを入れます。
先ほどと同様に、”Install New Software”から、”Work with:”の部分で以下のURLを入力します。
”http://download.eclipse.org/sequoyah/updates/2.0/”
そして、”Group items by category”のチェックを外してしばらく待つとプラグインの一覧が出てきます。
すべてにチェックを入れて、プラグインのインストールを行います。これもまたインストール後はeclipseの再起動が必要です。
[Window] => [Preferences] を開き、”Android”カテゴリ内の “Native Development” を開きます。
すると、NDK Location を入力する場所があるので、ここにNDKを展開したフォルダを指定しておきます。

動作チェック

ここまでの段階でAndroid Javaプロジェクトに対して、マウス操作でC/C++コード(JNI)の追加ができるようになっています。それを確認してみます。

まず適当なAndroidプロジェクトを作成します。

プロジェクトを作成した後、パッケージエクスプローラーで、作成したプロジェクトを選択した上で、右クリックします。
その中のメニューで、 “Android Tools”という項目の中に、”Add Native Support” という項目があります。
以下にスクリーンショット で示します。

これを選択すると、cppによるJNIのサポートが追加されます。
デフォルトで作成し、その後パースペクティブが”Native Android Perspective”に切り替わります。

こんな感じになっているので、cppの部分にJavaと接合するJNIのコードを書いていくことができます。

ここでは、hello-jniのコードと同じようなものを作成してみることにします。

#include <string.h>
#include <jni.h>

extern "C"
jstring Java_org_sample_MyApplicationActivity_helloFromJNI( JNIEnv* env, jobject thiz )
{
    return env->NewStringUTF( "Hello from JNI");
}
package org.sample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MyApplicationActivity extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView( this );
    tv.setText( helloFromJNI() );
    setContentView( tv );
  }

  static {
    System.loadLibrary( "MyApplication");
  }
  private static native String helloFromJNI();
}

コード loadLibraryしている部分の、”MyApplication”は自分の.soのファイルの先頭lib, 末尾.so を除いた部分を指定します。今回適当に作成したのでこのようになっています。各自の環境に合わせて変更する必要が出てくると思います。

プロジェクトのビルド

Project Explorerで、今回のプロジェクトを選び、右クリックすると”Build Project”という項目があります。
これを選択すると、JNIの部分のC/C++コードをビルドすることができます。

ビルドした結果は、Consoleのウィンドウに出てきます。ここで問題なく .so が生成されたかを確認することができます。ちなみに、通常のJavaアプリケーションのように実行ボタンを押したときでも、必要に応じてJNI部分のビルドコードは実行されるようです。

いつものように実行ボタンを押して、問題なくJNIのコードが呼び出されて動くことを確認してみてください。
記事として長くなってきたので、デバッグ用設定部分は次回の記事に回します。

いくつかのQ&A

– ビルドに失敗する。ndk-buildが見つからないという感じ

この場合、Cannot run program “ndk-build”メッセージがConsoleに表示されているはず。NDKのディレクトリ位置にパスを通しているのにも見つからない場合、設定をちょっと変更することで回避できる。

これを解決するには、Project Explorerから対象プロジェクトを選択し右クリックして、プロパティを表示させます。その中に、C/C++ Buildという項目があり、Builder Settings のタブで、Builder のコマンドを変更すれば一応解決することが可能です。

Use default build command のチェックを外し、cygwinのパス形式でndk-buildの場所を特定し、bashコマンドの引数として渡してあげればよい。

– “Build Project”が見当たらない or 前述のC/C++ BUildが見つからない

おそらくパースペクティブが Native Android Perspective になっていないからです。
一度確認してみましょう。

Androidプログラミング
すらりんをフォローする
すらりん日記

コメント

  1. ああ より:

    ndk-buildが見つからないといわれましたが
    ndk-buildのところを
    ndk-build.cmdとすると
    動作するようになりました。ndk-r8
    コマンドプロンプト用みたいですね。
    cygwin要らなくなったのかな。

タイトルとURLをコピーしました