微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > Android GPS架构分析(二)

Android GPS架构分析(二)

时间:10-02 整理:3721RD 点击:

ROMan">

initialize函数

LocationManagerService.java[php?mod=tag&id=6090" target="_blank" class="relatedlink">Frameworks\base\services\java\com\android\server]

private void initialize() {

// Create a wake lock, needs to be donebefore 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 = newGpsLocationProvider(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 jbooleanandroid_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz) {

if (!sGpsInterface)

sGpsInterface = gps_get_interface();

return (sGpsInterface != NULL);

}

frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp                              

前面已经提到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;

}

然后通过gps_find_hardware函数去得到gps接口,下面只模拟器中的gpsinterface。

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 Hardwareemulation\n");

return;

}

}

#endif

#ifdef HAVE_GPS_HARDWARE

sGpsInterface =gps_get_hardware_interface();

#endif

if (!sGpsInterface)

LOGD("no GPS hardware on thisdevice\n");

}

gps_qemu.c[hardware\libhardware_legacy\gps]

const GpsInterface*gps_get_qemu_interface()

{

return &qemuGpsInterface;

}

qemuGpsInterface的整体实现就在文件gps_qemu.c中。

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,

};

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hellolwl/archive/2011/04/06/6305689.aspx

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top