我已經在MotionSensors上註冊了一個偵聽器,現在只要將調用Motion change Method「onSensorChange()」。JNI .cpp文件如何將事件發送到Android中的Java框架
我知道這些調用來自SensorManager.java類intitates。我想知道這些傳感器如何改變來自JNI的事件,如何通過JNI觸發器更改事件並將其發送到Framework(SensorManager.java)。
我已經在MotionSensors上註冊了一個偵聽器,現在只要將調用Motion change Method「onSensorChange()」。JNI .cpp文件如何將事件發送到Android中的Java框架
我知道這些調用來自SensorManager.java類intitates。我想知道這些傳感器如何改變來自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)
)運行。起初它調用本地功能sensors_data_poll
,它返回已更改其值的傳感器的標識符(如果沒有這種傳感器,則返回-1)。如果它返回-1,則循環從頭開始。如果傳感器值已經改變,則從傳感器標識符創建的傳感器對象(final Sensor sensorObject = sHandleToSensor.get(sensor);
)。之後,有一個循環遍歷所有註冊的監聽器,並且如果監聽器正在監聽此傳感器對象,則會通知傳感器的值已更改。
完美::我知道你發佈在Framework中的SensorManager.java中可用的代碼,它調用了android_hardware_sensorManager.cpp jni文件的sensors_data_poll。但問題是我沒有得到data/change_event如何從/ gui包中的SensorManager.cpp和serviceservice.cpp中的可用服務包中發送。 – AAnkit
它沒有發送。該線程不斷地詢問循環中的所有傳感器,並調用本地函數來檢查值是否已更改。如果更改,則返回已更改值的傳感器ID。 – Yury