AndroidのC/C++を使ったネイティブコード(JNI)を、ソースコードデバッグできるように環境を整えることができました。環境にも若干左右されるようですが、概ねうまく動いてくれるようです。VisualStudio上ではなくEclipse上でではありますが、C/C++のソースコードレベルでブレークポイントを張ったり、変数を覗き見できるようになることは、開発のしやすさ向上につながると思います。
必要なもの
ここでは、Windowsでの開発環境を想定しています。以下のものがすでに整っているという前提で以降説明していきます。また、NDKのセットアップに関してはコマンドで ndk-build を実行して .so ファイルは作れる環境まで仕上がっているということを事前条件としています。
- Eclipse
- JavaによるAndroid開発環境が整っていること.
- ここに、CDT, Sequoyah プラグインを入れていきます。
- Android-SDK, NDK
- cygwin
Eclipseの環境を準備する
すると一覧が出てくるので、ここで”C/C++ Development Tools”を選びます。
インストール後には、Eclipseの再起動が必要になります。
そして、”Group items by category”のチェックを外してしばらく待つとプラグインの一覧が出てきます。
すると、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 になっていないからです。
一度確認してみましょう。
コメント
ndk-buildが見つからないといわれましたが
ndk-buildのところを
ndk-build.cmdとすると
動作するようになりました。ndk-r8
コマンドプロンプト用みたいですね。
cygwin要らなくなったのかな。