gpt4 book ai didi

android - JNI .cpp 文件如何将事件发送到 Android 中的 Java 框架

转载 作者:行者123 更新时间:2023-11-30 04:11:25 25 4
gpt4 key购买 nike

我已经在 , MotionSensors 上注册了一个监听器,现在只要运动更改方法“onSensorChange()”就会被调用。

我知道这些调用来自 SensorManager.java 类。我想知道这些传感器的变化事件是如何从JNI中来的,JNI是如何触发变化事件并将其发送给Framework(SensorManager.java)的。

最佳答案

如果您知道代码的确切位置,就不难检查它是如何工作的。所以主要部分在这里:

       while (true) {
// wait for an event
final int sensor = sensors_data_poll(sQueue, values, status, timestamp);

int accuracy = status[0];
synchronized (sListeners) {
if (sensor == -1 || sListeners.isEmpty()) {
// we lost the connection to the event stream. this happens
// when the last listener is removed or if there is an error
if (sensor == -1 && !sListeners.isEmpty()) {
// log a warning in case of abnormal termination
Log.e(TAG, "_sensors_data_poll() failed, we bail out: sensors=" + sensor);
}
// we have no more listeners or polling failed, terminate the thread
sensors_destroy_queue(sQueue);
sQueue = 0;
mThread = null;
break;
}
final Sensor sensorObject = sHandleToSensor.get(sensor);
if (sensorObject != null) {
// report the sensor event to all listeners that
// care about it.
final int size = sListeners.size();
for (int i=0 ; i<size ; i++) {
ListenerDelegate listener = sListeners.get(i);
if (listener.hasSensor(sensorObject)) {
// this is asynchronous (okay to call
// with sListeners lock held).
listener.onSensorChangedLocked(sensorObject,
values, timestamp, accuracy);
}
}
}
}
}
//Log.d(TAG, "exiting main sensor thread");
}

此代码在单独的线程 SensorThreadRunnable 中不断运行 (while (true))。首先,它调用 native 函数 sensors_data_poll,该函数返回已更改其值的传感器的标识符(如果没有此类传感器,则为 -1)。如果它返回 -1,则循环从头开始。如果传感器值已更改,则从传感器标识符创建 sensorObject (final Sensor sensorObject = sHandleToSensor.get(sensor);)。之后有一个循环遍历所有已注册的监听器,如果监听器正在监听此传感器对象,则会收到传感器值已更改的通知。

关于android - JNI .cpp 文件如何将事件发送到 Android 中的 Java 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10810897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com