Chinaunix首页 | 论坛 | 博客
  • 博客访问: 290986
  • 博文数量: 86
  • 博客积分: 694
  • 博客等级: 上士
  • 技术积分: 833
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-31 16:40
文章分类

全部博文(86)

文章存档

2012年(75)

2011年(6)

2010年(5)

分类: LINUX

2010-12-31 17:03:52


概述:

下面将从用户点击使能按钮开始的整个初始化流程跟踪一遍,这样在debug的时候可以

确保gps时候是否真的被初始化好了

======================================================================

当用户空间点击seting下的gps使能按钮的时候,会调用函数到:

frameworks/base/location/java/com/android/internal/location/GpsLocationProvider.java

这时会调用构造函数:

public GpsLocationProvider(Context context, ILocationManager locationManager) {

……………………………………

mThread = new GpsLocationProviderThread();

mThread.start();

…………………………………….

}

}

}

在构造函数中会创建一个线程,

会实例化一个消息处理对象: mHandler = new ProviderHandler();

private final class ProviderHandler extends Handler {

@Override

public void handleMessage(Message msg)

{

switch (msg.what) {

case ENABLE:

if (msg.arg1 == 1) {

handleEnable();

} else {

handleDisable();

}

break;

case ENABLE_TRACKING:

handleEnableLocationTracking(msg.arg1 == 1);

break;

………………………………………………….

}

}

};

那么线程和消息处理对象都ok后,进入的函数是:

public void enable() {

synchronized (mHandler) {

mHandler.removeMessages(ENABLE);

Message m = Message.obtain(mHandler, ENABLE);

m.arg1 = 1;

mHandler.sendMessage(m);

}

}

通过mHandler.sendMessage(m); 发送一个enable消息,接收消息方接收到enable消息后,

调用函数handleEnable()

private void handleEnable() {

if (DEBUG) Log.d(TAG, "handleEnable");

if (mEnabled) return;

mEnabled = native_init();

……………………………………….

mEventThread = new GpsEventThread();

mEventThread.start();

} else {

Log.w(TAG, "Failed to enable location provider");

}

}

NOTEhanleEnable实际上做了两件事情:

  1. 通过native_init 调用jni接口初始化gps的相关数据结构

  2. 通过mEventThread = new GpsEventThread();创建事件监听线程来监听gps来自hal层的事件

下面分别对以上两点做详细的跟踪:

对第一点native_init,进入函数

frameworks/base/core/jni/android_location_GpsLocationProvider.cpp

实际上调用的是函数android_location_GpsLocationProvider_init():

static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj)

{

android_location_GpsLocationProvider.cpp(android_location_GpsLocationProvider_init)");

if (!sGpsInterface)

sGpsInterface = gps_get_interface();

if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0)

return false;

………………………………………………………

return true;

}

这个函数主要是干两件事情:

  1. 填充sGpsInterface方法,通过调用函数gps_get_interface,这个函数在

hardware/libhardware_legacy/gps/gps.cpp

调用流程是:gps_get_interface=> gps_find_hardware=> gps_get_hardware_interface=>

sLocEngInterface

实际上sLocEngInterface就是static const GpsInterface的一个实例而已,里面实现gps

所有操作的方法:

loc_eng_init,

loc_eng_start,

loc_eng_stop,

loc_eng_cleanup,

loc_eng_inject_time,

loc_eng_inject_location,

loc_eng_delete_aiding_data,

loc_eng_set_position_mode,

loc_eng_get_extension,

执行完这步,实际上就是将gps可能用到的所有方法都初始化好了。

  1. 执行sGpsInterface->init(&sGpsCallbacks),这里实际上执行就是loc_eng_init,这个方法,

这个方法的关键代码如下:

static int loc_eng_init(GpsCallbacks* callbacks)

{

……………………………………………

loc_api_glue_init();

……………………………………..

memset(&loc_eng_data, 0, sizeof (loc_eng_data_s_type));

loc_eng_data.location_cb = callbacks->location_cb;

loc_eng_data.sv_status_cb = callbacks->sv_status_cb;

loc_eng_data.status_cb = callbacks->status_cb;

loc_eng_data.nmea_cb = callbacks->nmea_cb;

……………………………………..

}

该函数实现两个功能:

  1. 通过loc_api_glue_init();实现的功能是创建一个与ARM9 rpc通讯的通道,这部分内容比较多,在数据流程的文件里面分析。

  2. 通过loc_eng_data.location_cb = callbacks->location_cb;jni实现的方法注册到hal层,那么在hal调用相关函数的时候就可以实现hal层与jni的通讯,在数据流程文件里面分析。

回到前面framework层的enable的时候,出料native_init之外,还做了一件事情,就是通过

mEventThread = new GpsEventThread();创建一个监听线程,用来监听底层的事件:

private final class GpsEventThread extends Thread {

public GpsEventThread() {

super("GpsEventThread");

}

…………………………………..

native_wait_for_event();

}

if (DEBUG) Log.d(TAG, "GpsEventThread exiting");

}

}

通过native_wait_for_event()来监听hal来的事件,同样在jni层也有对应的文件去调用

对应的jni的函数是:android_location_GpsLocationProvider_wait_for_event

这个函数的功能如下:

假如在hal层有调用jnihal层的回调的时候,就会触发该线程运行去拷贝数据,上报事件等原因。

阅读(2871) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-01-04 15:04:07

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com