2011/03/21

[ndk]NativeActivityを使ってみる(1)

なるべく、楽をしたい。

今のところ、AndroidでNFC関係をやっているわけではないが、そのうちやりそうな気がする。
やるときは、楽をしたい。

Androidで楽をするというと、

  • Javaを使わない
  • JNIを使わない

が最初に出てくる。
楽をするというか、苦手なものを避けたいというか。
しかし、画面を出すにはJavaを使わないといかんし、RC-S620/SのライブラリをC/C++で作っているのでJNIを使わないといかん。

なのでいろいろと避けてきたのだが、そういえばNativeActivityというものがあることを思い出した。
ゲームなどの高速性が必要となる分野にはいいよ、みたいな記事をよく見かけたのだが、単にJavaを使うのがめんどうという人にも使えないだろうか?

そんな気持ちでやってみる。
3連休なのに家から出てないいいわけをするためにやっているわけではないぞ。


まず手本となるのは、NDKのサンプルであるnative-activityだろう。
サンプルを見ながらEclipseに組込み、動かす。
もちろん、動く。

OpenGL|ESなんかもよく知らないので、とにかく必要最低限のところまで削除することにした。
そうすると、glueを使う限りはあまり苦労しそうにない。

  • hasCode=false
  • android_main()
  • app_dummy
  • ALooper_pollAll()

コールバックを登録しておくと、タッチイベントがとって来れた。
座標もわかるので「見えないボタンを押す」と考えれば、適当な処理を座標で分岐すればできそうだ。
まあ、画面サイズの取得がわからないけど・・・。

よくわからんところも多いが、ここら辺から始めるかね。


static int32_t handle_input(struct android_app* app, AInputEvent* event)
{
        LOGI("handle_input");
        switch(AInputEvent_getType(event)) {
        case AINPUT_EVENT_TYPE_MOTION:
                LOGI("(%f, %f)", AMotionEvent_getX(event, 0), AMotionEvent_getY(event, 0));
                break;
        default:
                break;
        }
        return 0;
}

static void handle_cmd(struct android_app* app, int32_t cmd)
{
        LOGI("handle_cmd");
}

void android_main(struct android_app* state) {
    app_dummy();

    state->userData = 0;
    state->onAppCmd = handle_cmd;
    state->onInputEvent = handle_input;

    while (1) {
        int ident;
        int events;
        struct android_poll_source* source;

        while ((ident=ALooper_pollAll(0, NULL, &events, (void**)&source)) >= 0) {
            if (source != NULL) {
                source->process(state, source);
            }

            if (ident == LOOPER_ID_USER) {
            }

            if (state->destroyRequested != 0) {
                break;
            }
        }
    }
}

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。