Как JNI .cpp файлы отправляют события в Java Framework в Android

1

Я зарегистрировал прослушиватель, MotionSensors, теперь, когда будет изменен метод изменения движения "onSensorChange()".

Я знаю, что эти вызовы вступают в класс SensorManager.java. Я хочу знать, как эти сенсоры меняют события, поступает из JNI, как JNI trigger change Event и отправляет его в Framework (SensorManager.java).

Теги:
android-ndk
android-source

1 ответ

1
Лучший ответ

Если вы знаете, где именно находится код, нетрудно проверить, как это работает. Итак, главная часть здесь:

       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)). Сначала он вызывает встроенную функцию sensors_data_poll которая возвращает идентификатор датчика, который изменил его значение (или -1, если таких датчиков нет). Если он возвращает -1, цикл запускается с самого начала. Если значения датчика были изменены, то из идентификатора датчика создан датчик Object (final Sensor sensorObject = sHandleToSensor.get(sensor);). После этого есть цикл, который проходит по всему зарегистрированному слушателю, и если слушатель прослушивает этот сенсорный объект, он уведомляется о том, что значение датчика было изменено.

  • 0
    Perfect :: Я знаю, что вы разместили код, доступный в SensorManager.java в Framework, и он вызывает sensor_data_poll файла android_hardware_sensorManager.cpp jni. Но проблема в том, что я не понимаю, как данные / change_event отправляются из SensorManager.cpp, доступного в пакете / gui, и из sensorservice.cpp, доступного в пакете служб.
  • 0
    Это не отправлено. Этот поток постоянно запрашивает все датчики в цикле и вызывает собственную функцию, чтобы проверить, были ли изменены значения. Если изменено, то возвращается идентификатор датчика, значение которого было изменено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню