Android 的 gps module 是 gps.default.so 在system/lib/hw/ 目录上, 一般提供gps功能的手机应该实现这个module和真实gps硬件交互

Qemu中gps就是要构造一个gps.default.so, 但这个so并不和真的硬件打交道,只是个模拟接口,其代码在sdk/emulator/gps/gps_qemu.c中


Qemu 容器外部实现了一个gps设备,但这个设备和 Android 交互只能通过管道,所以gps_qemu.c的功能就是同管道打交道,并提供Android需要的gps functions, 如下:

static const GpsInterface qemuGpsInterface = {

    sizeof(GpsInterface),    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,};

Qemu外部GPS通过 QEMU_CHANNEL_NAME管道给 gps module 发送数据, 格式 NMEA, 所以 gps module 有几个函数负责 parse这些数据的


GPS模块有个要求,就是必须用它的 callback 来创建线程(gps_state_thread), 而将在的位置信息回调只能在此线程中(gps_state_thread),这是因为framework 需要一个vm可见的java thread, gps_state_thread 会被attach 到 vm 上了,从来回调 java 层函数

state->thread = callbacks->create_thread_cb( "gps_state_thread", gps_state_thread, state );
  
所以当QEMU_CHANNEL_NAME的位置信息过来不能直接调用callback, 而要在 gps_state_thread 发送到 android framework
因此 gps.default.so 调用 epoll 函数监听文件fd, 实现在 gps_state_thread 中把 location 信息送回

更多相关文章

  1. C语言函数的递归(上)
  2. 在Android实现人脸识别的详细过程
  3. Android中Handler小例子
  4. Android(安卓)View相关-View的常用方法及使用区别
  5. Android(安卓)使用RxJava+Retrofit +Realm 组合加载数据 (二)
  6. 【iOS-cocos2d-X 游戏开发之十三】详细讲解在Xcode中利用预编译
  7. Android(三):远程Service基本操作
  8. (二) RIL 层分析
  9. Android(安卓)自定义线程池

随机推荐

  1. Android(安卓)UI开发专题(一) 之界面设计
  2. 关于android组播DatagramPacket不能正常
  3. 有关Android线程的学习
  4. Android高性能编码三:数据结构和算法优化
  5. 编写一个基本的Android​应用程序
  6. Android学习笔记十九之Menu菜单
  7. Android主题与Toolbar样式之间的关系
  8. Android属性动画应用超简单代码打造酷炫
  9. 《Android(安卓)开发艺术探索》笔记——(3
  10. Android(安卓)ADK开发包示例开源代码