ASensorEventQueue_hasEvents returns -1 和 ALooper_pollAll returns -4 基本用法

ASensorEventQueue_hasEvents returns -1 and ALooper_pollAll returns -4 on basic usage

我正在尝试编写一个 android 应用程序,它使用 Java SDK 作为 GUI,并使用 NDK 绘制东西并读取线性加速度传感器(基于加速度计但不包括重力)。基本上,我想知道设备何时被摇动以及我的应用程序何时处于活动状态。

我认为我正在以相当基本的方式使用 ASensorEventQueue_hasEvents 和 ALooper_pollAll,但它们分别是 return -1 和 -4。这些是错误,但我不知道它们是什么意思,也不知道我可能做错了什么。欢迎任何帮助,谢谢!以下是一些代码片段:

要开始侦听来自线性加速度传感器的数据,我做了:

//sensorManager = ASensorManager_getInstance();
sensorManager = ASensorManager_getInstanceForPackage(mypackage);
sensor = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_LINEAR_ACCELERATION);
if (sensor == nullptr) {
    return env->NewStringUTF("Linear accelerometer is not present");
}

looper = ALooper_prepare(0);
if (looper == nullptr) {
    return env->NewStringUTF("Could not get looper.");
}

eventQueue = ASensorManager_createEventQueue(sensorManager, looper, EVENT_TYPE_LINEAR_ACCELEROMETER, nullptr, nullptr);
if (eventQueue == nullptr) {
    return env->NewStringUTF("Could not create event queue for sensor");
}

//ASensorEventQueue_disableSensor(eventQueue, sensor);
int minDelay = ASensor_getMinDelay(sensor);
minDelay = std::max(minDelay, MAX_EVENT_REPORT_TIME);

int rc = ASensorEventQueue_registerSensor(eventQueue, sensor, minDelay, minDelay);
rc = ASensorEventQueue_setEventRate(eventQueue, sensor, minDelay);
return env->NewStringUTF("");

我的绘图循环看起来像:

    int rc = ASensorEventQueue_enableSensor(eventQueue, sensor);
    std::vector<std::string> results;
    while (!stopDrawing) {
        int event = 0;
        void *data = nullptr;
        int rc;
        rc = ASensorEventQueue_hasEvents(eventQueue); // testing
        rc = ALooper_pollAll(wait_timeout, nullptr, &event, &data);
        if (rc == ALOOPER_POLL_TIMEOUT) {
            waiting += wait_timeout;

            if (waiting > EVENT_LOOP_TIMEOUT) {
                // If no data has been received, we have been waiting for a while, so assume
                // the shaking has stopped
                ASensorEventQueue_disableSensor(eventQueue, sensor);
            }
        } else if (rc == ALOOPER_POLL_ERROR) {
             return env->NewStringUTF("A looper error occurred");
        } else if (rc >= 0 && event == EVENT_TYPE_LINEAR_ACCELEROMETER) {
            std::vector<ASensorEvent> events;
            events.resize(100);
            while (ASensorEventQueue_hasEvents(eventQueue) == 1) {
                ssize_t nbrEvents = ASensorEventQueue_getEvents(eventQueue, events.data(), events.size());
                if (nbrEvents < 0) {
                    // an error has occurred
                    return env->NewStringUTF("");
                }

                float x = 0;
                float y = 0;
                float z = 0;
                for (int i = 0; i < nbrEvents; i++) {
                    x += events[i].acceleration.x;
                    y += events[i].acceleration.y;
                    z += events[i].acceleration.z;
                }

                graphics.updateAcceleration(x, y, z);
            }
        }
        graphics.updateUniformBuffer();
        graphics.drawFrame();
    }

注意:在 ALooper_pollAll 之前调用 ASensorEventQueue_hasEvents 只是为了让我可以看到它是什么 returning 因为 ALooper_pollAll 调用总是 return 出错了。当 运行 它在调试器中时,我看到 hasEvents 是 returning -1 而 pollAll 是 returning -4。这发生在 SDK 版本 24 和 26(我没试过 27,24 以下不支持 vulkan)。有什么想法吗?

我有这里描述的确切症状,对我来说,事实证明我是在不同的线程上准备弯针而不是在轮询上。