7. gps数据从HAL传输到Java
上面UlpLocation类型的mLocation作为参数传入,这里传递的还是UlpLocation类型的数据,不是hal层使用的GpsLocation类型,因此我们看一下UlpLocation类型的数据转换成GpsLocation类型的数据的过程:
hardware/qcom/gps/loc_api/libloc_api_50001/loc.cpp
GpsCallbacks的location_cb跟gps_loc_cb绑定到一起,其实就是绑定的是local_loc_cb,看一下local_loc_cb函数,local_loc_cb调用了gps_loc_cb,实际也就是调用的location_cb:
Gps_loc_cb函数的参数是&location->gpsLocation,也就是GpsLocation*类型的数据,在这里完成了从UlpLocation到GpsLocation类型的转换。GpsCallbacks的location_cb又对应了jni的location_callback,也就是说loc eng层的proc()最终调用到了jni的location_callback方法:
frameworks/base/services/core/jni/com_android_server_location_GpsLocationProvider.cpp
在往下就是reportLocation的流程了,最终将location信息传递给了上层,具体请看:frameworks/base/services/core/Java/com/android/server/location/GpsLocationProvider.java
Java上层调用流程图如下,
其他方法在java的传递方法和onLocationChanged方法几乎完全一样。
小结:
Position信息在loc_api层是qmiLocEventPositionReportIndMsgT_v02类型的数据,
在LocApiV02 :: reportPosition函数里面转换成UlpLocation类型的数据,然后经过一系列步骤发送到message queue中,
MsgTask:run函数从message queue中取出相应的数据,
然后调用proc()函数,在proc()函数里loc eng层的callback把数据转换成GpsLocation类型的数据,再传递到android framework层。