Android GPS架构分析(二)
来源:互联网 发布:板金展开软件 编辑:程序博客网 时间:2024/06/06 18:02
原文地址:http://hi.baidu.com/%CB%EF%CC%EF%BB%AA/blog/item/3a21a25488a5a7491138c22b.html
initialize函数 LocationManagerService.java[frameworks/base/services/java/com/android/server]private void initialize() {
// Create a wake lock, needs to be done before calling loadProviders() below
PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
// Load providers
loadProviders(); ...
initialize函数中最重要的就是loadProviders函数了,该函数调用loadProvidersLocked,然后loadProvidersLocked函数又调用_loadProvidersLocked函数。为什么要这么折腾呢?
先来看一部分的_loadProvidersLocked函数:
private void _loadProvidersLocked() {
// Attempt to load "real" providers first
if (GpsLocationProvider.isSupported()) {
// Create a gps location provider
GpsLocationProvider gpsProvider = new GpsLocationProvider(mContext, this);
mGpsStatusProvider = gpsProvider.getGpsStatusProvider();
mNetInitiatedListener = gpsProvider.getNetInitiatedListener();
addProvider(gpsProvider);
mGpsLocationProvider = gpsProvider;
}
...
注意这个if语句,狠重要,因为在这个语句中得到了HAL层的GPS接口GpsInterface。就是通过调用GpsLocationProvider的isSupported()函数才调用到gps.cpp[hardware/libhardware_legacy/gps]中的gps_get_interface()。这个isSupported函数才是第一个吃螃蟹的人。(而不是JNI层的init函数,这个下面会提到)。
GpsLocationProvider.cpp [frameworks/base/location/java/com/android/internal/location]
public static boolean isSupported() {
return native_is_supported();
}
然而isSupported只有一句话,果然是高手,一击必中。然后就调用native方法,也就是JNI层定义的方法。native_is_supported函数对于JNI层是android_location_GpsLocationProvider_is_supported方法。
android_location_GpsLocationProvider.cpp [frameworks/base/core/jni]
static jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz) {
if (!sGpsInterface)
sGpsInterface = gps_get_interface();
return (sGpsInterface != NULL);
}
前面已经提到JNI起到承上启下的作用,gps_get_interface函数属于HAL层的调用,在文件gps.cpp中。
gps.cpp [hardware/libhardware_legacy/gps]
const GpsInterface*
gps_get_interface()
{
if (sGpsInterface == NULL)
gps_find_hardware();
return sGpsInterface;
}
static void
gps_find_hardware( void )
{
#ifdef HAVE_QEMU_GPS_HARDWARE
if (qemu_check()) {
sGpsInterface = gps_get_qemu_interface();
if (sGpsInterface) {
LOGD("using QEMU GPS Hardware emulation/n");
return;
}
}
#endif
#ifdef HAVE_GPS_HARDWARE
sGpsInterface = gps_get_hardware_interface();
#endif
if (!sGpsInterface)
LOGD("no GPS hardware on this device/n");
}
gps_qemu.c [hardware/libhardware_legacy/gps]
const GpsInterface* gps_get_qemu_interface()
{
return &qemuGpsInterface;
}
static const GpsInterface qemuGpsInterface = {
qemu_gps_init,
qemu_gps_start,
qemu_gps_stop,
qemu_gps_cleanup,
qemu_gps_inject_time,
qemu_gps_inject_location,
qemu_gps_delete_aiding_data,
qemu_gps_set_position_mode,
qemu_gps_get_extension,
};
- Android GPS架构分析(二)
- Android GPS架构分析(二)
- Android GPS架构分析(转载二)
- Android GPS架构分析(二)
- Android GPS架构分析<二>
- Android GPS架构分析之二
- Android GPS架构分析
- Android GPS架构分析
- Android GPS架构分析
- Android GPS架构分析
- Android GPS架构分析
- Android GPS架构分析(gps启动过程图)
- Android GPS架构分析(gps启动过程图)
- Android GPS架构分析(gps启动过程图)
- Android GPS架构分析(gps启动过程图)
- Android GPS架构分析(一)
- Android GPS架构分析(三)
- Android GPS架构分析(四)
- List of Filesystems
- DOS批处理脚本语言简介
- 7.2.2 在窗体上显示绘图
- 打开终端
- ASP.NET之Using用法
- Android GPS架构分析(二)
- 有关于AJAX跨域访问的问题
- 《Microsoft SQL Server 2008 Analysis Services Step by Step》学习笔记十三:实施安全
- Java基础: 由 intern 看 String
- Android GPS架构分析(三)
- 大家常用的logg4j整理出来分享一下
- Android GPS架构分析(四)
- Android GPS架构分析(五)
- oracle 10G 寻老师