NDK API を使用して、コールバック関数を介して磁力計からサンプルを取得しています。ドキュメントによると、それはヘッダー ファイルsensor.h
でありlooper.h
、イベント キューを作成し、引数としてコールバック関数を渡すだけです。
/*
* Creates a new sensor event queue and associate it with a looper.
*/
ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
キューを作成してセンサーを有効にすると、コールバックが発生し、イベントがトリガーされたときにサンプルを取得できるようになります。ここまでは順調ですね。問題は、Java から適切な初期化を行うネイティブ関数を呼び出すときに、初期化関数から取得したサンプル (N 個のサンプルと見なす) にアクセスしたいことです。繰り返しますが、API によると、1 が返され、0 が返されてコールバックを停止する場合、コールバックは常に発生します。
/**
* For callback-based event loops, this is the prototype of the function
* that is called. It is given the file descriptor it is associated with,
* a bitmask of the poll events that were triggered (typically ALOOPER_EVENT_INPUT),
* and the data pointer that was originally supplied.
*
* Implementations should return 1 to continue receiving callbacks, or 0
* to have this file descriptor and callback unregistered from the looper.
*/
typedef int (*ALooper_callbackFunc)(int fd, int events, void* data);
問題は、これらのコールバックが実際にどのように機能するかを理解できないことです。つまり、イベント キューを初期化した後、コールバックが正しく発生し、0 を返した後にコールバック関数の外部から取得したサンプルにアクセスする方法がないようです。実際、コールバック関数は明らかに 0 までループしています。返されます。とにかくこれを行うことはありますか?このコールバック関数は実際にどのように機能しますか?