ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年12月18日 星期二

GpsLocationProvider : Enable, Disable

一樣,是用 Binder Message 傳送。
private final class ProviderHandler extends Handler { @Override public void handleMessage(Message msg) { int message = msg.what; switch (message) { case ENABLE: if (msg.arg1 == 1) { handleEnable(); } else { handleDisable(); } break;

是用第一個 argument 來通知 Enable/Disable。

Enable 時,執行的是: private void handleEnable() { if (DEBUG) Log.d(TAG, "handleEnable"); if (mEnabled) return; mEnabled = native_init();
也就是 call native_init -- jni 的 function。

Disable 時,執行的是: private void handleDisable() { if (DEBUG) Log.d(TAG, "handleDisable"); if (!mEnabled) return; mEnabled = false; stopNavigating(); // do this before releasing wakelock native_cleanup();
也就是 call native_cleanup()


這兩個 native function 分別是: static jboolean android_location_GpsLocationProvider_init(JNIEnv* env, jobject obj) { const GpsInterface* interface = GetGpsInterface(env, obj); 就是 GetGpsInterface( ),沒有 call Open( )..
所以在 GetGpsInterface( ) 就要 open ..

然後 cleanup 是..
static void android_location_GpsLocationProvider_cleanup(JNIEnv* env, jobject obj) { const GpsInterface* interface = GetGpsInterface(env, obj); if (interface) interface->cleanup(); }
所以知道這是一個類似 Sigletone 的 code,每次 call interface api 時,都要由 GetGpsInterface( ) 取得 handle 後,再判斷是否OK, 再 call ref function。
static const GpsInterface* sGpsInterface = NULL; static const GpsInterface* GetGpsInterface(JNIEnv* env, jobject obj) { // this must be set before calling into the HAL library if (!sGpsInterface) { sGpsInterface = get_gps_interface(); if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0) { sGpsInterface = NULL; return NULL; } } return sGpsInterface; }
GetGpsInterface function 其實是確保在第一次 new interface 時,會 call init( )




簡單的說,
  • Enable -- init
  • Disable -- cleanup

所以只要在 這兩個 native function 上實做 open, cloase com port 就可以

.. 但是看起來..又像是 start, stop.
這兩個分別對應到 startNavigating(), stopNavigating().

應該是作在 start(), stop()

沒有留言:

標籤

網誌存檔