完璧だ・・・完璧すぎる・・・。
うん。アラートダイアログを表示できたことが。
まぁ待て落ち着くのだ。ダイアログの表示なんて管理人であるところの
きゅーさんが懇切丁寧に解説していらっしゃるではありませんか。
40秒で支度して余裕で表示できますよ!
否。今回重要なのはファイル名が main.cpp であるところだ。
・・・
というわけで、Myライブラリも Android 対応が着々と進んでいます。
まさか STL+例外+ダイアログ表示 のたったこれだけで半日も時間とられるとは思わなかったので
刹那的な意味を込めた「わーいっ!きゃっきゃっ!」なノリで日記を書くことに至りました。
で、メモなどを徒然と。
まず NDK で例外を有効にします。NDK はデフォの状態では例外が使えません。
Android.mk に以下を追加。これだけ。(ググればすぐに出てくるけど・・・)
LOCAL_CPPFLAGS := -fexceptions
次に STL を有効にします。多分ググってすぐに出てくるのは、Application.mk に以下を追加する方法。
APP_STL := stlport_static
だけどここでビルドしてみると、以下のようなエラーが山のように出てきます。
undefined reference to `__cxa_get_exception_ptr'
undefined reference to `__cxa_end_cleanup'
等々・・・
なんていうか、stlport_static は例外に対応してないみたいです。(゚∇゚ ;)!?
ドキュメント漁ってたら、コレが使えるみたいでした。
APP_STL := gnustl_static
ここまでで STL+例外 はOK。ログもしっかり取れました。
そしてボスはアラートダイアログ。
なにがボスっぽいかっていうと、メインスレッドでは呼び出せないっていうこと。
・・・うん。ダメだったんです。
今回は NDK の中でも Native 中の Native な NativeActivity なるものを使っています。
これは WindowsAPI のプログラミングのように自分でメッセージループを作る必要があるのですが、
ループがたった1秒以上行われないとその瞬間Android から「貴様・・・ハングアップしたな。切るぞ」と脅されます。
それが関わっているためか、アプリはダイアログを表示した瞬間に動作を停止します。
恐ろしいことです。
ただ、簡単に並列処理を行える機能があったことが幸いでした。
以下のような Java クラスを作って showMessageBox() を C++ 側から呼ぶことでちゃんと表示できました。
public class MyActivity extends NativeActivity
{
public void showMessageBox()
{
this.runOnUiThread(new Runnable()
{
public void run()
{
final AlertDialog.Builder builder = new AlertDialog.Builder(mThisActivity);
builder.setTitle("Title"); // タイトルを設定
builder.setMessage("Message"); // メッセージを設定
builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
Log.d("Sample","OKを押した");
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
});
}
}
NDK っていうところからしてあんまり需要無いと思うけど。誰かの助けになれば。
それにしても・・・windows ってホント恵まれてるなぁ・・・。