android GPS HAL 回调函数实现

实现自己的GPS的HAL层,要实现gps.c文件,(按照Android系统的调用)参考 http://blog.chinaunix.net/uid-25570748-id-184090.html 分析的很好。
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><div style="line-height: 22px;"><span class="kwd">const</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> </span><span style="background-color: rgb(255, 255, 153);"><span class="typ">hw_module_t</span></span><span class="pln"> </span><span style="background-color: rgb(255, 204, 153);"><span class="pln">HAL_MODULE_INFO_SYM</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="pun">.</span><span class="pln">tag </span><span class="pun">=</span><span class="pln"> HARDWARE_MODULE_TAG</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="pun">.</span><span class="pln">version_major </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="pun">.</span><span class="pln">version_minor </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="pun">.</span><span class="pln">id </span><span class="pun">=</span><span class="pln"> GPS_HARDWARE_MODULE_ID</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="pun">.</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Goldfish GPS Module"</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="pun">.</span><span class="pln">author </span><span class="pun">=</span><span class="pln"> </span><span class="str">"The Android Open Source Project"</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="pun">.</span><span class="pln">methods </span><span class="pun">=</span><span class="pln"> </span><span class="pun">&</span><span style="background-color: rgb(153, 204, 255);"><span class="pln">gps_module_methods</span></span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">};</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">hw_module_methods_t</span><span class="pln"> </span><span style="background-color: rgb(153, 204, 255);"><span class="pln">gps_module_methods</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="pun">.</span><span class="pln">open </span><span class="pun">=</span><span class="pln"> </span><span style="background-color: rgb(0, 255, 255);"><span class="pln">open_gps</span></span></div><div style="line-height: 22px;"><span class="pun">};</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> o</span><span style="background-color: rgb(0, 255, 255);"><span class="pln">pen_gps</span></span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">hw_module_t</span><span class="pun">*</span><span class="pln"> </span><span class="kwd">module</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> </span><span class="kwd">const</span><span class="pun">*</span><span class="pln"> name</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">      </span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">hw_device_t</span><span class="pun">**</span><span class="pln"> device</span><span class="pun">)</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">gps_device_t</span><span class="pln"> </span><span class="pun">*</span><span class="pln">dev </span><span class="pun">=</span><span class="pln"> malloc</span><span class="pun">(</span><span class="kwd">sizeof</span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">gps_device_t</span><span class="pun">));</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  memset</span><span class="pun">(</span><span class="pln">dev</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(*</span><span class="pln">dev</span><span class="pun">));</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  D</span><span class="pun">(</span><span class="str">"%s: called\n"</span><span class="pun">,</span><span class="pln"> __FUNCTION__</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  dev</span><span class="pun">-></span><span class="pln">common</span><span class="pun">.</span><span class="pln">tag </span><span class="pun">=</span><span class="pln"> HARDWARE_DEVICE_TAG</span><span class="pun">;</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  dev</span><span class="pun">-></span><span class="pln">common</span><span class="pun">.</span><span class="pln">version </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  dev</span><span class="pun">-></span><span class="pln">common</span><span class="pun">.</span><span class="kwd">module</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">hw_module_t</span><span class="pun">*)</span><span class="kwd">module</span><span class="pun">;</span></div><div style="line-height: 22px;"><span class="com">//    dev->common.close = (int (*)(struct hw_device_t*))close_lights;</span></div><div style="line-height: 22px;"><span class="com">    dev->get_gps_interface = </span><span style="background-color: rgb(51, 204, 204);"><span class="com">gps__get_gps_interface</span></span><span class="com">;</span></div><div style="line-height: 22px;">
</div><div style="line-height: 22px;"><span class="pln">    *device </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">hw_device_t</span><span class="pun">*)</span><span class="pln">dev</span><span class="pun">;</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span></div><div style="line-height: 22px;"><span class="pun">}</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">const</span><span class="pln"> </span><span class="typ">GpsInterface</span><span class="pun">*</span><span class="pln"> </span><span style="background-color: rgb(51, 204, 204);"><span class="pln">gps__get_gps_interface</span></span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">gps_device_t</span><span class="pun">*</span><span class="pln"> dev</span><span class="pun">)</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  D</span><span class="pun">(</span><span class="str">"%s: called\n"</span><span class="pun">,</span><span class="pln"> __FUNCTION__</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">&</span><span style="background-color: rgb(153, 204, 0);"><span class="pln">sepGpsInterface</span></span><span class="pun">;</span></div><div style="line-height: 22px;"><span class="pun">}</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> </span><span class="typ">GpsInterface</span><span class="pln">  </span><span style="background-color: rgb(153, 204, 0);"><span class="pln">sepGpsInterface </span></span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="typ">GpsInterface</span><span class="pun">),</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_init</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_start</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_stop</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_cleanup</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_inject_time</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_inject_location</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_delete_aiding_data</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_set_position_mode</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  sep_gps_get_extension</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">};</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
这里的GpsInterface定义如下,在hardware/libhardware/include/hardware/gps.h文件中
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="com">/** Represents the standard GPS interface. */</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="kwd">typedef</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> </span><span class="pun">{</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="typ">size_t</span><span class="pln">          size</span><span class="pun">;</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">int</span><span class="pln">   </span><span class="pun">(*</span><span class="pln">init</span><span class="pun">)(</span><span class="pln"> </span><span style="background-color: rgb(128, 128, 0);"><span class="typ">GpsCallbacks</span></span><span class="pun">*</span><span class="pln"> callbacks </span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">int</span><span class="pln">   </span><span class="pun">(*</span><span class="pln">start</span><span class="pun">)(</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">int</span><span class="pln">   </span><span class="pun">(*</span><span class="pln">stop</span><span class="pun">)(</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">void</span><span class="pln">  </span><span class="pun">(*</span><span class="pln">cleanup</span><span class="pun">)(</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">int</span><span class="pln">   </span><span class="pun">(*</span><span class="pln">inject_time</span><span class="pun">)(</span><span class="typ">GpsUtcTime</span><span class="pln"> time</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int64_t</span><span class="pln"> timeReference</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> uncertainty</span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">int</span><span class="pln">  </span><span class="pun">(*</span><span class="pln">inject_location</span><span class="pun">)(</span><span class="kwd">double</span><span class="pln"> latitude</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">double</span><span class="pln"> longitude</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> accuracy</span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">void</span><span class="pln">  </span><span class="pun">(*</span><span class="pln">delete_aiding_data</span><span class="pun">)(</span><span class="typ">GpsAidingData</span><span class="pln"> flags</span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">int</span><span class="pln">   </span><span class="pun">(*</span><span class="pln">set_position_mode</span><span class="pun">)(</span><span class="typ">GpsPositionMode</span><span class="pln"> mode</span><span class="pun">,</span><span class="pln"> </span><span class="typ">GpsPositionRecurrence</span><span class="pln"> recurrence</span><span class="pun">,</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">            </span><span class="typ">uint32_t</span><span class="pln"> min_interval</span><span class="pun">,</span><span class="pln"> </span><span class="typ">uint32_t</span><span class="pln"> preferred_accuracy</span><span class="pun">,</span><span class="pln"> </span><span class="typ">uint32_t</span><span class="pln"> preferred_time</span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pln">    </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">void</span><span class="pun">*</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">get_extension</span><span class="pun">)(</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pun">*</span><span class="pln"> name</span><span class="pun">);</span></span><span style="font-family: monospace; line-height: 22px; white-space: pre;">
</span><span style="font-family: monospace; line-height: 22px; white-space: pre;"><span class="pun">}</span><span class="pln"> </span><span class="typ">GpsInterface</span><span class="pun">;</span></span></span></p>

<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span class="com">/** GPS callback structure. */</span>
<span class="kwd">typedef</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> </span><span class="pun">{</span>
<span class="pln">    </span><span class="com">/** set to sizeof(GpsCallbacks) */</span>
<span class="pln">    </span><span class="typ">size_t</span><span class="pln">      size</span><span class="pun">;</span>
<span class="pln">    gps_location_callback location_cb</span><span class="pun">;</span>
<span class="pln">    gps_status_callback status_cb</span><span class="pun">;</span>
<span class="pln">    gps_sv_status_callback sv_status_cb</span><span class="pun">;</span>
<span class="pln">    gps_nmea_callback nmea_cb</span><span class="pun">;</span>
<span class="pln">    gps_set_capabilities set_capabilities_cb</span><span class="pun">;</span>
<span class="pln">    gps_acquire_wakelock acquire_wakelock_cb</span><span class="pun">;</span>
<span class="pln">    gps_release_wakelock release_wakelock_cb</span><span class="pun">;</span>
<span class="pln">    gps_create_thread create_thread_cb</span><span class="pun">;</span>
<span class="pun">}</span><span class="pln"> </span><span style="background-color: rgb(128, 128, 0);"><span class="typ">GpsCallbacks</span></span><span class="pun">;</span></p>

比如说GpsInterface里面init函数,需要一个参数,callbacks,没有发现哪里有对回调函数的定义。有读了一遍别人的博客的分析 http://blog.chinaunix.net/uid-25570748-id-184090.html
GPS服务启动的过程中,在JNI层会去初始化GPS
com_android_server_location_GpsLocationProvider.cpp文件中的ini函数
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span class="kwd">static</span><span class="pln"> jboolean </span><span style="background-color: rgb(255, 255, 153);"><span class="pln">android_location_GpsLocationProvider_init</span></span><span class="pun">(</span><span class="typ">JNIEnv</span><span class="pun">*</span><span class="pln"> env</span><span class="pun">,</span><span class="pln"> jobject obj</span><span class="pun">)</span>
<span class="pun">{</span>
<span class="pln">    </span><span class="kwd">const</span><span class="pln"> </span><span class="typ">GpsInterface</span><span class="pun">*</span><span class="pln"> </span><span class="kwd">interface</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span style="background-color: rgb(51, 153, 102);"><span class="typ">GetGpsInterface</span></span><span class="pun">(</span><span class="pln">env</span><span class="pun">,</span><span class="pln"> obj</span><span class="pun">);</span>
<span class="pln">    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="kwd">interface</span><span class="pun">)</span>
<span class="pln">        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span>

<span class="pln">    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">sGpsDebugInterface</span><span class="pun">)</span>
<span class="pln">       sGpsDebugInterface </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">GpsDebugInterface</span><span class="pun">*)</span><span class="kwd">interface</span><span class="pun">-></span><span class="pln">get_extension</span><span class="pun">(</span><span class="pln">GPS_DEBUG_INTERFACE</span><span class="pun">);</span>

<span class="pln">    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span>
<span class="pun">}</span></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: 宋体, Arial; line-height: 21px; white-space: normal;"><span class="pun">调用了</span><span class="typ">GetGpsInterface</span><span class="pun">去获取接口并初始化</span><span class="pln">GPS</span></span></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;">
</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> </span><span class="typ">GpsInterface</span><span class="pun">*</span><span class="pln"> </span><span style="background-color: rgb(51, 153, 102);"><span class="typ">GetGpsInterface</span></span><span class="pun">(</span><span class="typ">JNIEnv</span><span class="pun">*</span><span class="pln"> env</span><span class="pun">,</span><span class="pln"> jobject obj</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span>
<span class="pln">    </span><span class="com">// this must be set before calling into the HAL library</span>
<span class="pln">    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mCallbacksObj</span><span class="pun">)</span>
<span class="pln">        mCallbacksObj </span><span class="pun">=</span><span class="pln"> env</span><span class="pun">-></span><span class="typ">NewGlobalRef</span><span class="pun">(</span><span class="pln">obj</span><span class="pun">);</span>

<span class="pln">    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">sGpsInterface</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span>
<span class="pln">        sGpsInterface </span><span class="pun">=</span><span class="pln"> get_gps_interface</span><span class="pun">();</span>
<span class="pln">        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">sGpsInterface </span><span class="pun">||</span><span class="pln"> sGpsInterface</span><span class="pun">-></span><span class="pln">init</span><span class="pun">(&</span><span style="background-color: rgb(204, 255, 255);"><span class="pln">sGpsCallbacks</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span>
<span class="pln">            sGpsInterface </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span>
<span class="pln">            </span><span class="kwd">return</span><span class="pln"> NULL</span><span class="pun">;</span>
<span class="pln">        </span><span class="pun">}</span>
<span class="pln">    </span><span class="pun">}</span>
<span class="pln">    </span><span class="kwd">return</span><span class="pln"> sGpsInterface</span><span class="pun">;</span>
<span class="pun">}</span></p>
GetGpsInterface里面也去调用了get_gps_interface(),而这个函数最早的地方便是isSupported()的这个函数。在获取了这个接口之后,使用sGpsInterface->init函数进行了初始化。原来是在这里注册了回调函数。
sGpsCallbacks是个全局变量,在com_android_server_location_GpsLocationProvider.cpp文件中
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span style="background-color: rgb(153, 204, 0);"><span class="typ">GpsCallbacks</span></span><span class="pln"> </span><span style="background-color: rgb(204, 255, 255);"><span class="pln">sGpsCallbacks</span></span><span class="pln"> = </span><span class="pun">{</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="typ">GpsCallbacks</span><span class="pun">),</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  </span><span style="background-color: rgb(204, 255, 204);"><span class="pln">location_callback</span></span><span class="pun">,</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  status_callback</span><span class="pun">,</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  sv_status_callback</span><span class="pun">,</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  nmea_callback</span><span class="pun">,</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  set_capabilities_callback</span><span class="pun">,</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  acquire_wakelock_callback</span><span class="pun">,</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  release_wakelock_callback</span><span class="pun">,</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">  </span><span class="pln">  create_thread_callback</span><span class="pun">,</span></div><div style="line-height: 22px; font-family: Arial, Helvetica, sans-serif; white-space: normal;"><span class="pun">};</span></div>
然后,也有各个回调函数的实现
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span style="background-color: rgb(204, 255, 204);"><span class="pln">location_callback</span></span><span class="pun">(</span><span class="typ">GpsLocation</span><span class="pun">*</span><span class="pln"> location</span><span class="pun">)</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="typ">JNIEnv</span><span class="pun">*</span><span class="pln"> env </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AndroidRuntime</span><span class="pun">::</span><span class="pln">getJNIEnv</span><span class="pun">();</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  env</span><span class="pun">-></span><span class="typ">CallVoidMethod</span><span class="pun">(</span><span class="pln">mCallbacksObj</span><span class="pun">,</span><span class="pln"> method_reportLocation</span><span class="pun">,</span><span class="pln"> location</span><span class="pun">-></span><span class="pln">flags</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">          (jdouble</span><span class="pun">)</span><span class="pln">location</span><span class="pun">-></span><span class="pln">latitude</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">jdouble</span><span class="pun">)</span><span class="pln">location</span><span class="pun">-></span><span class="pln">longitude</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">          (jdouble</span><span class="pun">)</span><span class="pln">location</span><span class="pun">-></span><span class="pln">altitude</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">          (jfloat</span><span class="pun">)</span><span class="pln">location</span><span class="pun">-></span><span class="pln">speed</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">jfloat</span><span class="pun">)</span><span class="pln">location</span><span class="pun">-></span><span class="pln">bearing</span><span class="pun">,</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">          (jfloat</span><span class="pun">)</span><span class="pln">location</span><span class="pun">-></span><span class="pln">accuracy</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">jlong</span><span class="pun">)</span><span class="pln">location</span><span class="pun">-></span><span class="pln">timestamp</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  checkAndClearExceptionFromCallback</span><span class="pun">(</span><span class="pln">env</span><span class="pun">,</span><span class="pln"> __FUNCTION__</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">}</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> status_callback</span><span class="pun">(</span><span class="typ">GpsStatus</span><span class="pun">*</span><span class="pln"> status</span><span class="pun">)</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="typ">JNIEnv</span><span class="pun">*</span><span class="pln"> env </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AndroidRuntime</span><span class="pun">::</span><span class="pln">getJNIEnv</span><span class="pun">();</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  env</span><span class="pun">-></span><span class="typ">CallVoidMethod</span><span class="pun">(</span><span class="pln">mCallbacksObj</span><span class="pun">,</span><span class="pln"> method_reportStatus</span><span class="pun">,</span><span class="pln"> status</span><span class="pun">-></span><span class="pln">status</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  checkAndClearExceptionFromCallback</span><span class="pun">(</span><span class="pln">env</span><span class="pun">,</span><span class="pln"> __FUNCTION__</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">}</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> sv_status_callback</span><span class="pun">(</span><span class="typ">GpsSvStatus</span><span class="pun">*</span><span class="pln"> sv_status</span><span class="pun">)</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="typ">JNIEnv</span><span class="pun">*</span><span class="pln"> env </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AndroidRuntime</span><span class="pun">::</span><span class="pln">getJNIEnv</span><span class="pun">();</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  memcpy</span><span class="pun">(&</span><span class="pln">sGpsSvStatus</span><span class="pun">,</span><span class="pln"> sv_status</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">sGpsSvStatus</span><span class="pun">));</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  env</span><span class="pun">-></span><span class="typ">CallVoidMethod</span><span class="pun">(</span><span class="pln">mCallbacksObj</span><span class="pun">,</span><span class="pln"> method_reportSvStatus</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  checkAndClearExceptionFromCallback</span><span class="pun">(</span><span class="pln">env</span><span class="pun">,</span><span class="pln"> __FUNCTION__</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">}</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> nmea_callback</span><span class="pun">(</span><span class="typ">GpsUtcTime</span><span class="pln"> timestamp</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pun">*</span><span class="pln"> nmea</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> length</span><span class="pun">)</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="typ">JNIEnv</span><span class="pun">*</span><span class="pln"> env </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AndroidRuntime</span><span class="pun">::</span><span class="pln">getJNIEnv</span><span class="pun">();</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="com">// The Java code will call back to read these values</span></div><div style="line-height: 22px;"><span class="com">    // We do this to avoid creating unnecessary String objects</span></div><div style="line-height: 22px;"><span class="com">    sNmeaString = nmea;</span></div><div style="line-height: 22px;"><span class="com">    sNmeaStringLength = length;</span></div><div style="line-height: 22px;"><span class="com">    env->CallVoidMethod(mCallbacksObj, method_reportNmea, timestamp);</span></div><div style="line-height: 22px;"><span class="com">    checkAndClearExceptionFromCallback(env, __FUNCTION__);</span></div><div style="line-height: 22px;"><span class="com">}</span></div><div>
</div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> set_capabilities_callback</span><span class="pun">(</span><span class="typ">uint32_t</span><span class="pln"> capabilities</span><span class="pun">)</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  LOGD</span><span class="pun">(</span><span class="str">"set_capabilities_callback: %ld\n"</span><span class="pun">,</span><span class="pln"> capabilities</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="typ">JNIEnv</span><span class="pun">*</span><span class="pln"> env </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AndroidRuntime</span><span class="pun">::</span><span class="pln">getJNIEnv</span><span class="pun">();</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  env</span><span class="pun">-></span><span class="typ">CallVoidMethod</span><span class="pun">(</span><span class="pln">mCallbacksObj</span><span class="pun">,</span><span class="pln"> method_setEngineCapabilities</span><span class="pun">,</span><span class="pln"> capabilities</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  checkAndClearExceptionFromCallback</span><span class="pun">(</span><span class="pln">env</span><span class="pun">,</span><span class="pln"> __FUNCTION__</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">}</span></div><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"></p>
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; white-space: normal;"></span></p><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> acquire_wakelock_callback</span><span class="pun">()</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  acquire_wake_lock</span><span class="pun">(</span><span class="pln">PARTIAL_WAKE_LOCK</span><span class="pun">,</span><span class="pln"> WAKE_LOCK_NAME</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">}</span></div><div style="line-height: 22px;">
</div><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> release_wakelock_callback</span><span class="pun">()</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  release_wake_lock</span><span class="pun">(</span><span class="pln">WAKE_LOCK_NAME</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">}</span></div><div style="line-height: 22px;">
</div><div style="line-height: 22px;"><span class="kwd">static</span><span class="pln"> </span><span class="typ">pthread_t</span><span class="pln"> create_thread_callback</span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">char</span><span class="pun">*</span><span class="pln"> name</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">start</span><span class="pun">)(</span><span class="kwd">void</span><span class="pln"> </span><span class="pun">*),</span><span class="pln"> </span><span class="kwd">void</span><span class="pun">*</span><span class="pln"> arg</span><span class="pun">)</span></div><div style="line-height: 22px;"><span class="pun">{</span></div><div style="line-height: 22px;"><span class="pun">  </span><span class="pln">  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="typ">pthread_t</span><span class="pun">)</span><span class="typ">AndroidRuntime</span><span class="pun">::</span><span class="pln">createJavaThread</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> start</span><span class="pun">,</span><span class="pln"> arg</span><span class="pun">);</span></div><div style="line-height: 22px;"><span class="pun">}</span></div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值