2011/02/14

Android NDKに触ってみる

OpenCVの勉強とともに、Androidの勉強もしています。
OpenCVをAndroidで動かすために、避けて通れないのがAndroid NDK。

というわけで今日はAndroid NDKの設定をやっていきたいと思います。

まずはAndroid developers のサイトにいきます。 http://developer.android.com/intl/ja/sdk/ndk/index.html
これを書いている時点では、ndk-r5bが最新のようです。

にインストールの方法が書いてありました。
(テキトー翻訳です。大筋は合っている。。。はず)

Installing the NDK(NDKをインストール)
NDKをインストールするためには、下記の2ステップを行う必要があります。
1.このページのテーブルのリンクから、あなたのコンピュータの環境に対応するパッケージをダウンロードします。
2.ダウンロードしたNDKを解凍します。解凍後、android-ndk-<version>というフォルダが出来上がります。(今回はandroid-ndk-r5b) 必要であれば、NDKのフォルダ名を変更しても構いません。 このドキュメントでは、NDKディレクトリを<ndk>と表します。
さあ、これでNDKを使うことができるようになりました。


Getting Started with the NDK(NDKを使ってみる)
NDKのインストールが完了したら、NDKに入っているドキュメントを少し読んで見てください。ドキュメントは<ndk>/docs/にあります。
OVERVIEW.HTMLをざっと読めば、使い方が大体分かると思います。
一般的なNDKの使い方は下記のとおりとなります。
1.ネイティブのソースコードを<project>/jni/フォルダに置きます。
2.<project>/jni/Android.mk を作成します。
3.(オプション)<project>/jni/Application.mk を作成します。
4.ネイティブコードを'ndk-build' スクリプトを使ってビルドします。ndk-buildはNDKの直下にあります。
    cd <project>
     <ndk>/ndk-build
     ビルドツールは、必要な共有ライブラリをアプリケーションのプロジェクトディレクトリにコピーします。
5.最後に、いつものようにアプリケーションをコンパイルします。SDKツールが共有ライブラリを.apkファイルに組み込みます。
完全な情報はNDKパッケージのドキュメントに含まれています。


ほうほう。。

というわけで早速いつものHello!Worldを作っていきましょう。
まずはNDKをダウンロードして解凍します。 NDKのインストールはこれで終わり。

Eclipseを起動し、Androidアプリケーションのプロジェクトを作ります。
ちょっと手抜きをして、NDKのsampleフォルダにHello-jniというフォルダがあるので
そこからjniフォルダをコピーしてきます。

jniフォルダにある、Android.mkファイルの中身は下記のとおりとなっていました。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

うーん、、、hello-jni.cからhello-jniというものを作るためのものなのでしょうか。 詳細はまだ調べていません。

また、hello-jni.cというファイルもあったので開いてみます。
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
    return (*env)->NewStringUTF(env, "Hello from JNI !");
}

なんか長い間数名があります。
もしかしてプロジェクトの名前空間の名前を関数に埋め込む必要があるのでしょうか。

hello-jni.javaファイルから、onCreate等をコピーしてきます。

public class hellondk 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( stringFromJNI() );
        setContentView(tv);
    }


   public native String  stringFromJNI();

   static {
        System.loadLibrary("hello-jni");
    }
}

まずはC言語の方からコンパイル。
cd <hellondkのプロジェクトのパス>
ndk-build
>Compile thumb  : hello-jni <= hello-jni.c
>SharedLibrary  : libhello-jni.so
>Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
なにやらライブラリができて、libs/armeabi/hello-jni.soにコピーされたようです。

Eclipseの方に戻って、Androidプロジェクトをビルド。
ビルドでエラーが出なかったので実行。










おや?エラーが出ました
LogCatには、
No implementation found for nativ Lcom/sample/hellondk/hellondk;./stirngFromJNI() Ljava/lang/String;
と出てます。
間数名も変更しないとダメみたいですね。

Java_com_example_hellojni_HelloJni_stringFromJNI
から
Java_com_sample_hellondk_hellondk_stringFromJNI
に間数名を変えて、ndk-buildしてから再度Androidアプリの方をビルド。










すると、Hello JNI と文字が出ました。
とりあえずはJNIを使うAndroidアプリが出来たようです。

ただ、Android.mkファイルの作り方や、CのソースコードにあったJNIEnv* env などについてはもう少し調べる必要がありそうです。

ではまた。

0 件のコメント:

コメントを投稿