直前の記事「android_main 関数(ループ前)」では、android_main 関数の最初の部分について、検討しました。 ここでは、その続きで、メインループ開始前までの部分を検討しています。
自動生成されたコードのこの部分には、主にセンサーの初期化があります。今はセンサーを利用しないので深くは追っていません。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。
投稿 January 29, 2018, 最終更新 July 30, 2018(様式変更)
Visual C++ 2015 で、新しく Android ネイティブアプリを作成したときに作成される、main.cpp の android_main 関数の struct engine の engine を初期化・設定したあとの部分、メインループ前までを検討します。
void android_main(struct android_app* state) { (中略) // 加速度計の監視の準備 engine.sensorManager = ASensorManager_getInstance(); engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager, ASENSOR_TYPE_ACCELEROMETER); engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager, state->looper, LOOPER_ID_USER, NULL, NULL); if (state->savedState != NULL) { // 以前の保存状態で開始します。復元してください。 engine.state = *(struct saved_state*)state->savedState; } → 以降、メインループに続く。
engine.sensorManager は、ASensorManager* として定義されています。 Android Developers では、「SensorManager」に該当します。 このクラスは android.hardware.SensorManager ですので、ハードウェアに関するものと言えます。 デバイスのセンサーへのアクセスであるとされています。
ASensorManager_getInstance 関数は、センサーマネージャーへの参照(ポインタ)を返している、ということになります。
注意書きとして、センサーを使わないとき、特にアプリがポーズ状態(表にいない)では必ず disable すること、でないと電池の無駄遣いになります、とありますので、注意しないといけません。
engine.accelerometerSensor は、const ASensor* として定義されています。 Android Developers の「Sensor」のページに、センサーの一覧がありました。 ASensorManager_getDefaultSensor 関数に ASENSOR_TYPE_ACCELEROMETER を渡して、加速度の既定センサーを取得しています(ない場合は NULL が返る)。
engine.sensorEventQueue は、ASensorEventQueue* として定義されています。 「新たなセンサー イベントキューを作成し、ルーパーに関連づけます」ということです。 「ルーパー」とは 「スレッドのイベントループをトラックしている状態のこと」だそうですが、 現時点では、Windows の「メッセージキュー(メッセージループ)」相当、と考えて良さそうです。 第2引数の state->looper が ALooper* であるとされていますので、ここにメッセージが送られる、と言えます。 なお、ALooper は、単なる構造体のようです。
まとめると、加速度センサーを使いたいので、加速度センサーを取得するために
投稿 January 29, 2018, 最終更新 July 30, 2018(様式変更)
続きの部分についても確認します。
if (state->savedState != NULL) {
// 以前の保存状態で開始します。復元してください。
engine.state = *(struct saved_state*)state->savedState;
}
基本的に、ポーズ状態になると、ここで保存したデータ以外は壊されても文句を言えない、なので状態を再現するのに必要なデータは保存が必要、 で、それはコードの通り、struct saved_state 構造体に入っていなくてはならない、ということです。
なるべく元の状態に戻したいからといって、あまりにもたくさんの(メモリを使う)データを保存するのも良くないでしょうから、サイズの目安があるといいのですが。
Visual C++ 2015 で、Android ネイティブアプリを作成するため、新規プロジェクトを作成する手順を記録しています。
おすすめ記事はありません。