Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7de8655b authored by Anil Admal's avatar Anil Admal Committed by Android (Google) Code Review
Browse files

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

parents b281e071 0c2b21bd
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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();

+18 −3
Original line number Diff line number Diff line
@@ -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 *>(