gps_freerunner.c (3)
java 側と jni 側の i/f を色々確認など。
ええと、直接の i/f (?) になってるのは framewaks/base/location/java/com/android/internal/location/LocationProvider.java な模様。ソースファイルの最後らへんに native なメソドの定義があります。
static { class_init_native(); } private static native void class_init_native(); private static native boolean native_is_supported(); private native boolean native_init(); private native void native_disable(); private native void native_cleanup(); private native boolean native_start(int positionMode, boolean singleFix, int fixInterval); private native boolean native_stop(); private native void native_set_fix_frequency(int fixFrequency); private native void native_delete_aiding_data(int flags); private native void native_wait_for_event();
上記の名前を登録していると思われるのが frameworks/base/core/jni/android_location_GpsLocationProvider.cpp のこれも最後らへんの以下なあたり。
static JNINativeMethod sMethods[] = { /* name, signature, funcPtr */ {"class_init_native", "()V", (void *)android_location_GpsLocationProvider_class_init_native}, {"native_is_supported", "()Z", (void*)android_location_GpsLocationProvider_is_supported}, {"native_init", "()Z", (void*)android_location_GpsLocationProvider_init}, {"native_disable", "()V", (void*)android_location_GpsLocationProvider_disable}, {"native_cleanup", "()V", (void*)android_location_GpsLocationProvider_cleanup}, {"native_start", "(IZI)Z", (void*)android_location_GpsLocationProvider_start}, {"native_stop", "()Z", (void*)android_location_GpsLocationProvider_stop}, {"native_delete_aiding_data", "(I)V", (void*)android_location_GpsLocationProvider_delete_aiding_data}, {"native_wait_for_event", "()V", (void*)android_location_GpsLocationProvider_wait_for_event}, {"native_read_sv_status", "([I[F[F[F[I)I", (void*)android_location_GpsLocationProvider_read_sv_status}, {"native_read_nmea", "(I[BI)I", (void*)android_location_GpsLocationProvider_read_nmea}, {"native_inject_time", "(JJI)V", (void*)android_location_GpsLocationProvider_inject_time}, {"native_inject_location", "(DDF)V", (void*)android_location_GpsLocationProvider_inject_location}, {"native_supports_xtra", "()Z", (void*)android_location_GpsLocationProvider_supports_xtra}, {"native_inject_xtra_data", "([BI)V", (void*)android_location_GpsLocationProvider_inject_xtra_data}, {"native_agps_data_conn_open", "(Ljava/lang/String;)V", (void*)android_location_GpsLocationProvider_agps_data_conn_open}, {"native_agps_data_conn_closed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_closed}, {"native_agps_data_conn_failed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_failed}, {"native_set_agps_server", "(ILjava/lang/String;I)V", (void*)android_location_GpsLocationProvider_set_agps_server}, {"native_send_ni_response", "(II)V", (void*)android_location_GpsLocationProvider_send_ni_response}, {"native_get_internal_state", "()Ljava/lang/String;", (void*)android_location_GpsLocationProvider_get_internal_state}, }; int register_android_location_GpsLocationProvider(JNIEnv* env) { return jniRegisterNativeMethods(env, "com/android/internal/location/GpsLocationProvider", sMethods, NELEM(sMethods)); }
で、register_android_location_GpsLocationProvider という手続きはどこで呼び出されているのかというと、frameworks/base/core/jni/AndroidRuntime.cpp の register_jni_procs という手続きから、となっております。その先はスルー。
うーん
とりあえず、gps_state_init 手続きから kick される thread (gps_state_thread) が云々とか GpsState 構造体の control 属性が云々とかナチュラルな方向をセメてたんですが、見当違いでした。そもそも GpsState 構造体って gps_freerunner.c の中に閉じてるし。
むむむ、とウナりつつ android_location_GpsLocationProvider.cpp 見てたら以下な定義があって
GpsCallbacks sGpsCallbacks = { location_callback, status_callback, sv_status_callback, nmea_callback };
これを init に渡してるでないの。
if (!sGpsInterface) sGpsInterface = gps_get_interface(); if (!sGpsInterface || sGpsInterface->init(&sGpsCallbacks) != 0) return false;
これを使って情報のやりとりをしている、って事にしましょう。ただ、
GPS_STATUS_CB(state->callbacks, GPS_STATUS_SESSION_BEGIN);
なマクロがあったりして定義を grep で探そうとしたらこれも gps_freerunner.c の中に定義がありまして以下。
#define GPS_STATUS_CB(_cb, _s) \ if ((_cb).status_cb) { \ GpsStatus gps_status; \ gps_status.status = (_s); \ (_cb).status_cb(&gps_status); \ DFR("gps status callback: 0x%x", _s); \ }
次は jni 側の callback と java 側の協調動作のしくみか。これは JNI 使えばなんとかなる、という事なのか。で、LocationManagerService has GpsLocationProvider という形になっている、と。
とりあえず
昼寝る。