このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com
作成日 January 12, 2018、最終更新日 June 8, 2018(様式変更)
トップページ > Android 開発トップ > android_main 関数(ループ前)

Android 開発

main.cpp の android_main 関数の冒頭、struct engine の初期化部分を検討します。

アプリが起動されてまず制御が来るのが、エントリーポイントとなる android_main 関数です。 自動生成されたコードをもとに、この流れを確認します。ここでは、冒頭の初期化部分を検討しています。

ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

android_main 関数(ループ前)

投稿 January 12, 2018, 最終更新 July 30, 2018(様式変更)

Windows 10 + Visual C++ 2015 で、新しく Android ネイティブアプリを作成したときに作成される、main.cpp の android_main 関数を見ます。 これはいわゆる main 関数で、 エントリーポイント ( 最初に呼び出される関数という意味で ) となるものと言えます。 この関数の最初で初期化処理を行い、メインループですべての処理を実行して、この関数が終わるとアプリも終わる、ということです。

android_main 関数の最初の部分、メインループに入る前(センサーの初期化などサンプルコードの前)は、次のようになっていました。

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

	memset(&engine, 0, sizeof(engine));
	state->userData = &engine;
	state->onAppCmd = engine_handle_cmd;
	state->onInputEvent = engine_handle_input;
	engine.app = state;
→ 以降、センサーの初期化やメインループに続く。

まず、引数の struct android_app* state は、いつでもどこでも使う、非常に大事なデータです。

struct engine は、「アプリの保存状態」と、コメントされています。
生成コードでは main.cpp の最初の部分で定義されていますが、私は別に作成したクラスからも参照したかったので、 別のヘッダに移動しました。内容は変えていません。

/**
* アプリの保存状態です。
*/
struct engine {
	struct android_app* app;

	ASensorManager* sensorManager;
	const ASensor* accelerometerSensor;
	ASensorEventQueue* sensorEventQueue;

	int animating;
	EGLDisplay display;
	EGLSurface surface;
	EGLContext context;
	int32_t width;
	int32_t height;
	struct saved_state state;
};

アプリが停止されるときに保存し、復帰するときに再読み込みするための構造体ということですが、 現時点(1/12/2018)ではどれぐらいのサイズまでが行儀が良いのか、良く理解していません。

とりあえず、ASensor で始まるものはセンサー系の情報であり、サンプルコードでセンサーを使用しているためなので、必須ではないと思われます。
EGL で始まるものは OpenGL ( オープンソースなグラフィックライブラリです。 ) 系の情報で、画面の描画に必要です。width と height は、画面のサイズを保持します。
最初の struct android_app* app; は、アプリ情報を管理する重要なものです。
animating は、ループ管理のようです。
最後の struct saved_state state; が、保存すべきデータを持つ構造体のようです。

まだ理解が浅くてすみません。

▲ページ先頭へ

メッセージと入力のハンドラー

投稿 January 12, 2018, 最終更新 July 30, 2018(様式変更)

戻って、android_main 関数のパラメータ設定部分です。

	state->userData = &engine;
	state->onAppCmd = engine_handle_cmd;
	state->onInputEvent = engine_handle_input;

statestruct android_app* です。
userData に engine のポインタを設定しているので、struct android_app* があれば、struct engine を参照可能です。
続いて、onAppCmdengine_handle_cmd 関数を設定しています。 APP_CMD_INIT_WINDOW や、APP_CMD_TERM_WINDOW といった Android からのシステムメッセージがあると、 この関数 ( onAppCmd に設定された、engine_handle_cmd 関数 ) が呼び出される、ということになります。もともと自動的に作成されますので、このままで構わないのですが。
最後の onInputEventには engine_handle_input 関数を設定しています。 タッチやキーの入力があったとき、 この関数 ( onInputEvent に設定された、engine_handle_input 関数 ) が呼び出されます。こちらも自動的に作成されていますので、ここままです。

ちなみに、engine_handle_cmd 関数は次のようになっています。

static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
	struct engine* engine = (struct engine*)app->userData;
	switch (cmd) {
	case APP_CMD_INIT_WINDOW:
		// ウィンドウの初期化処理
	case APP_CMD_TERM_WINDOW:
		// ウィンドウの終了処理

engine_handle_input 関数は、次のようです。

static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {
	struct engine* engine = (struct engine*)app->userData;
	if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
		// タッチ処理

ですので、メッセージ処理 engine_handle_cmd 関数、入力処理 engine_handle_input 関数、 そしてメインループから呼び出されるフレーム描画関数が、最重要関数と言えるでしょう。

▲ページ先頭へ

関連トピックス

android_main 関数(ループ前2)
ネイティブアプリ プロジェクトの基本、android_main 関数について検討しています。このページの後半です。

android_main 関数(メインループ)
ネイティブアプリ プロジェクトの基本、android_main 関数について検討しています。メインループ部分です。


その他のおすすめ
おすすめ記事はありません。

JavaScriptが無効です
▲ページ先頭へ


© 2017-2019 StraightApps.com 無断転載を禁じます。No reproduction without permission.