Android GPS JNI层只有一个文件,起到承上启下的作用。上层承接Framework,下层调用HAL层具体硬件抽象实现。
目录:
frameworks/base/services/core/jni/com_android_server_location_GpsLocationProvider.cpp
首先来看注册JNI方法的函数定义:
int register_android_server_location_GpsLocationProvider(JNIEnv* env)
{
return jniRegisterNativeMethods(
env,
"com/android/server/location/GpsLocationProvider",
sMethods,
NELEM(sMethods));
}
此函数被同目录下onload.cpp文件调用,调用地方在:
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
ALOGE("GetEnv failed!");
return result;
}
ALOG_ASSERT(env, "Could not retrieve the env!");
//... ...省略其他注册代码
register_android_server_location_GpsLocationProvider(env);
return JNI_VERSION_1_4;
}
从这里可以看到,JNI初始化的时候,即会进行JNI方法的注册,从而使上层应用通过JNI调用C/C++本地的方法
在com_android_server_location_GpsLocationProvider.cpp中,数组sMethods定义如下