Android GPS杂记(1)

来源:互联网 发布:淘宝店怎么才能有人气 编辑:程序博客网 时间:2024/05/22 06:52

1、GPS框架


2、GPS代码简介

2.1 头文件

我们先从头文件(hardware/libhardware/include/hardware/gps.h)入手,看一下android原生态代码中提供了什么结构体等。

结构体:GpsLocation  -- 提供了经纬度、速度、方位角、高度、精度、UTC时间戳信息;

GpsStatus  --  提供GPS定位状态,一共有五种:

#define GPS_STATUS_NONE 0//未知状态
#define GPS_STATUS_SESSION_BEGIN 1 //已经开始导航
#define GPS_STATUS_SESSION_END 2//停止导航
#define GPS_STATUS_ENGINE_ON 3//已经通电但没有导航
#define GPS_STATUS_ENGINE_OFF 4//没有通电状态

   GpsSvInfo -- 可见卫星信息,卫星伪随机数、信号强度、海拔、方位角(但是有人说是卫星编号,信号强度,卫星仰望角,方位角,待求证!

  GpsSvStatus --  可见卫星状态。可见卫星数、一组可见卫星的卫星信息(GpsSvInfo)、星历(ephemeris)、历书(almanac)、参与定位定位的卫星。

GpsCallbacks -- 回调函数。其中包括8个回调函数:location_callback、status_callback、sv_status_callback、nmea_callback、set_capabilities、acquire_wakelock、release_wakelock、create_thread。

GpsInterface -- 接口定义,包括8个接口:init、start、stop、cleanup、inject_time、inject_location、delete_aiding_data、set_position_mode。

(callback与interface可以这么理解:callback在别的地方实现的,我来调用(call),以返回我的信息(back);initerface是我实现的,提供了一个接口(face),供别人调用)

gps_device_t --继承自hw_device_tcommon,硬件适配接口,向上层提供了重要的get_gps_interface接口。

2.2 模块和回调函数的注册

GPS采用的是HAL Stub框架,这种框架被概括为:三个结构体、两个常量、一个函数,具体参考http://blog.csdn.net/mr_raptor/article/details/8074549,(感谢老师讲解)这里就不做介绍了。

注册过程中,调用open_gps();得到device,而dev->get_gps_interface = gps__get_gps_interface,从而得到GpsInterface,上层即可使用init等8个接口了;上层在使用Init接口时传入了gpsCallbacks。这样上下就建立了联系,接下来gps_state_init初始化GPS串口,建立gps_state_thread,然后启动for(;;)循环主控着NMEA数据的读出、解析、上报等。

3、JNI中间层

GPSJNI适配层的源码位于:frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp

如想深入理解JNI的工作机理和中间件的作用,请参考http://blog.csdn.net/mr_raptor/article/details/8082360。

首先看注册JNI方法的函数定义:

[plain] view plaincopy
  1. int register_android_server_location_GpsLocationProvider(JNIEnv* env)  
  2. {  
  3.     return jniRegisterNativeMethods(env, "com/android/server/location/GpsLocationProvider", sMethods, NELEM(sMethods));  
  4. }  


此函数被同目录下onload.cpp文件调用,调用地方在:

[cpp] view plaincopy
  1. extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)  
  2. {  
  3.     JNIEnv* env = NULL;  
  4.     jint result = -1;  
  5.   
  6.     if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {  
  7.         LOGE("GetEnv failed!");  
  8.         return result;  
  9.     }  
  10.     LOG_ASSERT(env, "Could not retrieve the env!");  
  11.   
  12.     //...省略其他注册代码  
  13.     register_android_server_location_GpsLocationProvider(env);  
  14.   
  15.     return JNI_VERSION_1_4;  
  16. }  

从这里可以看到,JNI初始化的时候,即会进行JNI方法的注册,从而使上层应用能通过JNI调用c/c++本地方法。

回到register_android_server_location_GpsLocationProvider函数,变量sMethods定义如下:

[cpp] view plaincopy
  1. static JNINativeMethod sMethods[] = {  
  2.      /* name, signature, funcPtr */  
  3.     {"class_init_native""()V", (void *)android_location_GpsLocationProvider_class_init_native},  
  4.     {"native_is_supported""()Z", (void*)android_location_GpsLocationProvider_is_supported},  
  5.     {"native_init""()Z", (void*)android_location_GpsLocationProvider_init},  
  6.     {"native_cleanup""()V", (void*)android_location_GpsLocationProvider_cleanup},  
  7.     {"native_set_position_mode""(IIIII)Z", (void*)android_location_GpsLocationProvider_set_position_mode},  
  8.     {"native_start""()Z", (void*)android_location_GpsLocationProvider_start},  
  9.     {"native_stop""()Z", (void*)android_location_GpsLocationProvider_stop},  
  10.     {"native_delete_aiding_data""(I)V", (void*)android_location_GpsLocationProvider_delete_aiding_data},  
  11.     {"native_read_sv_status""([I[F[F[F[I)I", (void*)android_location_GpsLocationProvider_read_sv_status},  
  12.     {"native_read_nmea""([BI)I", (void*)android_location_GpsLocationProvider_read_nmea},  
  13.     {"native_inject_time""(JJI)V", (void*)android_location_GpsLocationProvider_inject_time},  
  14.     {"native_inject_location""(DDF)V", (void*)android_location_GpsLocationProvider_inject_location},  
  15.     {"native_supports_xtra""()Z", (void*)android_location_GpsLocationProvider_supports_xtra},  
  16.     {"native_inject_xtra_data""([BI)V", (void*)android_location_GpsLocationProvider_inject_xtra_data},  
  17.     {"native_agps_data_conn_open""(Ljava/lang/String;)V", (void*)android_location_GpsLocationProvider_agps_data_conn_open},  
  18.     {"native_agps_data_conn_closed""()V", (void*)android_location_GpsLocationProvider_agps_data_conn_closed},  
  19.     {"native_agps_data_conn_failed""()V", (void*)android_location_GpsLocationProvider_agps_data_conn_failed},  
  20.     {"native_agps_set_id","(ILjava/lang/String;)V",(void*)android_location_GpsLocationProvider_agps_set_id},  
  21.     {"native_agps_set_ref_location_cellid","(IIIII)V",(void*)android_location_GpsLocationProvider_agps_set_reference_location_cellid},  
  22.     {"native_set_agps_server""(ILjava/lang/String;I)V", (void*)android_location_GpsLocationProvider_set_agps_server},  
  23.     {"native_send_ni_response""(II)V", (void*)android_location_GpsLocationProvider_send_ni_response},  
  24.     {"native_agps_ni_message""([BI)V", (void *)android_location_GpsLocationProvider_agps_send_ni_message},  
  25.     {"native_get_internal_state""()Ljava/lang/String;", (void*)android_location_GpsLocationProvider_get_internal_state},  
  26.     {"native_update_network_state""(ZIZLjava/lang/String;)V", (void*)android_location_GpsLocationProvider_update_network_state },  
  27. };  

JNI是framework与HAL的中间信使,这些函数值得我们认真研究。JNI中,函数的签名的得到,可以参考http://hi.baidu.com/scuyangl/item/414a039590ef82b5cd80e5dd。在HAL与JNI间调用依靠callback和interface,在framework和JNI间依靠函数Regist(regist是JNI与framework的函数映射,framework可以通过对应的函数调用到JNI的对应函数)和GetMethodID(getMethodID得到的函数在framework实现,JNI可以使用)。

上面函数都是在该.cpp文件下实现的,比如:

  1. static jboolean android_location_GpsLocationProvider_is_supported(JNIEnv* env, jclass clazz) {
  2.     return (sGpsInterface != NULL || get_gps_interface() != NULL);
  3. }

4、Java Framework

framework层代码比较复杂,可参考:http://blog.csdn.net/lbmygf/article/details/6525195、http://blog.csdn.net/lbmygf/article/details/652519)



本文参考:

http://blog.csdn.net/xnwyd/article/details/7198728

http://blog.csdn.net/liukun321/article/details/8871963

http://blog.csdn.net/mr_raptor/article/details/8082360

http://blog.csdn.net/lbmygf/article/details/6525195

原创粉丝点击