android ndk sensor,Android NDK Sensor奇怪的报告间隔到事件队列

我尝试从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秒后出现吗?或者有没有办法确保我在他们想要的运行中收到它们?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值