Merge "Cache GNSS JNI methodIds/classes at system initialization" into qt-dev

This commit is contained in:
Anil Admal
2019-05-07 15:48:34 +00:00
committed by Android (Google) Code Review
2 changed files with 24 additions and 9 deletions

View File

@@ -1597,8 +1597,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private void reportGnssServiceDied() {
if (DEBUG) Log.d(TAG, "reportGnssServiceDied");
mHandler.post(() -> {
class_init_native();
setupNativeGnssService();
setupNativeGnssService(/* reinitializeGnssServiceHandle = */ true);
if (isEnabled()) {
synchronized (mLock) {
mEnabled = false;
@@ -2052,7 +2051,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
* this handler.
*/
private void handleInitialize() {
setupNativeGnssService();
// class_init_native() already initializes the GNSS service handle during class loading.
setupNativeGnssService(/* reinitializeGnssServiceHandle = */ false);
if (native_is_gnss_visibility_control_supported()) {
mGnssVisibilityControl = new GnssVisibilityControl(mContext, mLooper);
@@ -2214,8 +2214,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
pw.append(s);
}
private void setupNativeGnssService() {
native_init_once();
private void setupNativeGnssService(boolean reinitializeGnssServiceHandle) {
native_init_once(reinitializeGnssServiceHandle);
/*
* A cycle of native_init() and native_cleanup() is needed so that callbacks are
@@ -2244,7 +2244,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private static native boolean native_is_gnss_visibility_control_supported();
private static native void native_init_once();
private static native void native_init_once(boolean reinitializeGnssServiceHandle);
private native boolean native_init();

View File

@@ -1495,7 +1495,8 @@ struct GnssBatchingCallback_V2_0 : public IGnssBatchingCallback_V2_0 {
}
};
static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {
/* Initializes the GNSS service handle. */
static void android_location_GnssLocationProvider_set_gps_service_handle() {
gnssHal_V2_0 = IGnss_V2_0::getService();
if (gnssHal_V2_0 != nullptr) {
gnssHal = gnssHal_V2_0;
@@ -1514,7 +1515,12 @@ static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env,
gnssHal = IGnss_V1_0::getService();
}
static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass clazz) {
/* One time initialization at system boot */
static void android_location_GnssLocationProvider_class_init_native(JNIEnv* env, jclass clazz) {
// Initialize the top level gnss HAL handle.
android_location_GnssLocationProvider_set_gps_service_handle();
// Cache methodIDs and class IDs.
method_reportLocation = env->GetMethodID(clazz, "reportLocation",
"(ZLandroid/location/Location;)V");
method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V");
@@ -1638,7 +1644,11 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
(jclass) env->NewGlobalRef(gnssConfiguration_halInterfaceVersionClass);
method_halInterfaceVersionCtor =
env->GetMethodID(class_gnssConfiguration_halInterfaceVersion, "<init>", "(II)V");
}
/* Initialization needed at system boot and whenever GNSS service dies. */
static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass clazz,
jboolean reinitializeGnssServiceHandle) {
/*
* Save a pointer to JVM.
*/
@@ -1647,6 +1657,10 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass
LOG_ALWAYS_FATAL("Unable to get Java VM. Error: %d", jvmStatus);
}
if (reinitializeGnssServiceHandle) {
android_location_GnssLocationProvider_set_gps_service_handle();
}
if (gnssHal == nullptr) {
ALOGE("Unable to get GPS service\n");
return;
@@ -1871,6 +1885,7 @@ static jobject android_location_GnssConfiguration_get_gnss_configuration_version
return createHalInterfaceVersionJavaObject(env, major, minor);
}
/* Initialization needed each time the GPS service is shutdown. */
static jboolean android_location_GnssLocationProvider_init(JNIEnv* env, jobject obj) {
/*
* This must be set before calling into the HAL library.
@@ -3026,7 +3041,7 @@ static const JNINativeMethod sMethods[] = {
android_location_GnssLocationProvider_class_init_native)},
{"native_is_supported", "()Z", reinterpret_cast<void *>(
android_location_GnssLocationProvider_is_supported)},
{"native_init_once", "()V", reinterpret_cast<void *>(
{"native_init_once", "(Z)V", reinterpret_cast<void *>(
android_location_GnssLocationProvider_init_once)},
{"native_init", "()Z", reinterpret_cast<void *>(android_location_GnssLocationProvider_init)},
{"native_cleanup", "()V", reinterpret_cast<void *>(