我尝试从NDK访问加速度计.到目前为止它的作用.但事件写入事件队列的方式似乎有点奇怪.
请参阅以下代码:
ASensorManager* AcquireASensorManagerInstance(void) {
typedef ASensorManager *(*PF_GETINSTANCEFORPACKAGE)(const char *name);
void* androidHandle = dlopen("libandroid.so", RTLD_NOW);
PF_GETINSTANCEFORPACKAGE getInstanceForPackageFunc = (PF_GETINSTANCEFORPACKAGE) dlsym(androidHandle, "ASensorManager_getInstanceForPackage");
if (getInstanceForPackageFunc) {
return getInstanceForPackageFunc(kPackageName);
}
typedef ASensorManager *(*PF_GETINSTANCE)();
PF_GETINSTANCE getInstanceFunc = (PF_GETINSTANCE) dlsym(androidHandle, "ASensorManager_getInstance");
return getInstanceFunc();
}
void init() {
sensorManager = AcquireASensorManagerInstance();
accelerometer = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_ACCELEROMETER);
looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
accelerometerEventQueue = ASensorManager_createEventQueue(sensorManager, looper, LOOPER_ID_USER, NULL, NULL);
auto status = ASensorEventQueue_enableSensor(accelerometerEventQueue,
accelerometer);
status = ASensorEventQueue_setEventRate(accelerometerEventQueue,
accelerometer,
SENSOR_REFRESH_PERIOD_US);
}
这就是我初始化一切的方式.我的SENSOR_REFRESH_PERIOD_US是100.000 – 每秒10次刷新.现在我有以下方法来接收事件队列的事件.
vector update() {
ALooper_pollAll(0, NULL, NULL, NULL);
vector listEvents;
ASensorEvent event;
while (ASensorEventQueue_getEvents(accelerometerEventQueue, &event, 1) > 0) {
listEvents.push_back(sensorEvent{event.acceleration.x, event.acceleration.y, event.acceleration.z, (long long) event.timestamp});
}
return listEvents;
}
此时的sensorEvent是我使用的自定义结构.这个更新方法每隔10秒从一个IntentService通过JNI从Android调用(以确保它甚至在应用程序本身被杀死时运行).现在我希望收到100个值(每秒10个* 10秒).在不同的测试中,我收到了大约130个,对我来说也完全没问题,即使它有点偏.然后我在ASensorEventQueue_setEventRate的文档中读到它没有被强制遵循给定的刷新周期.因此,如果我得到的比我想要的更多,那就完全没问题了.
但现在问题是:有时候我会在10秒钟内收到13个值,当我继续调用更新10秒后,我得到130个值之前运行的117个值.这完全随机发生,有时它不是下一次运行,而是第四次跟随或类似的事情.
通过拥有更多的价值,我可以完全摆脱刷新期.但有人可以解释为什么会发生这么多的值丢失并且它们会在下一次运行10秒后出现吗?或者有没有办法确保我在他们想要的运行中收到它们?