diff options
author | 2025-03-11 17:21:02 -0700 | |
---|---|---|
committer | 2025-03-11 17:21:02 -0700 | |
commit | bbfe97e0a501046971751d242206664c34264cfe (patch) | |
tree | d8daa80e3f75750a66d194e2778f988de487f368 | |
parent | 1323ed897ae6fec3300e70c31b192c3f545d9513 (diff) | |
parent | f9422cc2fe9314b32b3c75677ff266f180a4098e (diff) |
Merge "Add GnssAssistance JNI." into main
-rw-r--r-- | location/java/android/location/flags/location.aconfig | 8 | ||||
-rw-r--r-- | services/core/java/com/android/server/location/gnss/GnssManagerService.java | 41 | ||||
-rw-r--r-- | services/core/java/com/android/server/location/gnss/hal/GnssNative.java | 46 | ||||
-rw-r--r-- | services/core/jni/Android.bp | 3 | ||||
-rw-r--r-- | services/core/jni/com_android_server_location_GnssLocationProvider.cpp | 36 | ||||
-rw-r--r-- | services/core/jni/gnss/Android.bp | 5 | ||||
-rw-r--r-- | services/core/jni/gnss/Gnss.cpp | 11 | ||||
-rw-r--r-- | services/core/jni/gnss/Gnss.h | 2 | ||||
-rw-r--r-- | services/core/jni/gnss/GnssAssistance.cpp | 2047 | ||||
-rw-r--r-- | services/core/jni/gnss/GnssAssistance.h | 135 | ||||
-rw-r--r-- | services/core/jni/gnss/GnssAssistanceCallback.cpp | 48 | ||||
-rw-r--r-- | services/core/jni/gnss/GnssAssistanceCallback.h | 48 |
12 files changed, 2424 insertions, 6 deletions
diff --git a/location/java/android/location/flags/location.aconfig b/location/java/android/location/flags/location.aconfig index f8eb41826c6f..496ba501e49c 100644 --- a/location/java/android/location/flags/location.aconfig +++ b/location/java/android/location/flags/location.aconfig @@ -186,3 +186,11 @@ flag { bug: "398254728" is_fixed_read_only: true } + +flag { + name: "gnss_assistance_interface_jni" + namespace: "location" + description: "Flag for GNSS assistance interface JNI" + bug: "209078566" +} + diff --git a/services/core/java/com/android/server/location/gnss/GnssManagerService.java b/services/core/java/com/android/server/location/gnss/GnssManagerService.java index 6a72cc7c7779..7d9f2c29f943 100644 --- a/services/core/java/com/android/server/location/gnss/GnssManagerService.java +++ b/services/core/java/com/android/server/location/gnss/GnssManagerService.java @@ -24,6 +24,7 @@ import android.hardware.location.GeofenceHardware; import android.hardware.location.GeofenceHardwareImpl; import android.location.FusedBatchOptions; import android.location.GnssAntennaInfo; +import android.location.GnssAssistance; import android.location.GnssCapabilities; import android.location.GnssMeasurementCorrections; import android.location.GnssMeasurementRequest; @@ -35,6 +36,8 @@ import android.location.IGnssStatusListener; import android.location.IGpsGeofenceHardware; import android.location.Location; import android.location.LocationManager; +import android.location.flags.Flags; +import android.location.provider.IGnssAssistanceCallback; import android.location.util.identity.CallerIdentity; import android.os.BatteryStats; import android.os.Binder; @@ -47,12 +50,13 @@ import com.android.internal.app.IBatteryStats; import com.android.server.FgThread; import com.android.server.location.gnss.hal.GnssNative; import com.android.server.location.injector.Injector; +import com.android.server.location.provider.proxy.ProxyGnssAssistanceProvider; import java.io.FileDescriptor; import java.util.List; /** Manages Gnss providers and related Gnss functions for LocationManagerService. */ -public class GnssManagerService { +public class GnssManagerService implements GnssNative.GnssAssistanceCallbacks { public static final String TAG = "GnssManager"; public static final boolean D = Log.isLoggable(TAG, Log.DEBUG); @@ -75,6 +79,8 @@ public class GnssManagerService { private final GnssMetrics mGnssMetrics; + private @Nullable ProxyGnssAssistanceProvider mProxyGnssAssistanceProvider = null; + public GnssManagerService(Context context, Injector injector, GnssNative gnssNative) { mContext = context.createAttributionContext(ATTRIBUTION_ID); mGnssNative = gnssNative; @@ -100,6 +106,16 @@ public class GnssManagerService { /** Called when system is ready. */ public void onSystemReady() { mGnssLocationProvider.onSystemReady(); + + if (Flags.gnssAssistanceInterfaceJni()) { + mProxyGnssAssistanceProvider = + ProxyGnssAssistanceProvider.createAndRegister(mContext); + if (mProxyGnssAssistanceProvider == null) { + Log.e(TAG, "no gnss assistance provider found"); + } else { + mGnssNative.setGnssAssistanceCallbacks(this); + } + } } /** Retrieve the GnssLocationProvider. */ @@ -323,6 +339,29 @@ public class GnssManagerService { } } + @Override + public void onRequestGnssAssistanceInject() { + if (!Flags.gnssAssistanceInterfaceJni()) { + return; + } + if (mProxyGnssAssistanceProvider == null) { + Log.e(TAG, "ProxyGnssAssistanceProvider is null"); + return; + } + mProxyGnssAssistanceProvider.request(new IGnssAssistanceCallback.Stub() { + @Override + public void onError() { + Log.e(TAG, "GnssAssistanceCallback.onError"); + } + + @Override + public void onResult(GnssAssistance gnssAssistance) { + Log.d(TAG, "GnssAssistanceCallback.onResult"); + mGnssNative.injectGnssAssistance(gnssAssistance); + } + }); + } + private class GnssCapabilitiesHalModule implements GnssNative.BaseCallbacks { GnssCapabilitiesHalModule(GnssNative gnssNative) { diff --git a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java index c79a21a7eea8..7b4c56334868 100644 --- a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java +++ b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java @@ -23,6 +23,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.location.GnssAntennaInfo; +import android.location.GnssAssistance; import android.location.GnssCapabilities; import android.location.GnssMeasurementCorrections; import android.location.GnssMeasurementsEvent; @@ -30,6 +31,7 @@ import android.location.GnssNavigationMessage; import android.location.GnssSignalType; import android.location.GnssStatus; import android.location.Location; +import android.location.flags.Flags; import android.os.Binder; import android.os.Handler; import android.os.SystemClock; @@ -275,6 +277,12 @@ public class GnssNative { void onRequestPsdsDownload(int psdsType); } + /** Callbacks for HAL requesting GNSS assistance. */ + public interface GnssAssistanceCallbacks { + /** On request GnssAssistance injection. */ + void onRequestGnssAssistanceInject(); + } + /** Callbacks for AGPS functionality. */ public interface AGpsCallbacks { @@ -400,6 +408,7 @@ public class GnssNative { private TimeCallbacks mTimeCallbacks; private LocationRequestCallbacks mLocationRequestCallbacks; private PsdsCallbacks mPsdsCallbacks; + private @Nullable GnssAssistanceCallbacks mGnssAssistanceCallbacks; private AGpsCallbacks mAGpsCallbacks; private NotificationCallbacks mNotificationCallbacks; @@ -504,6 +513,16 @@ public class GnssNative { mNotificationCallbacks = Objects.requireNonNull(callbacks); } + /** Sets GnssAssistanceCallbacks. */ + public void setGnssAssistanceCallbacks(GnssAssistanceCallbacks callbacks) { + if (!Flags.gnssAssistanceInterfaceJni()) { + return; + } + Preconditions.checkState(!mRegistered); + Preconditions.checkState(mGnssAssistanceCallbacks == null); + mGnssAssistanceCallbacks = Objects.requireNonNull(callbacks); + } + /** * Registers with the HAL and allows callbacks to begin. Once registered with the native HAL, * no more callbacks can be added or set. Must only be called once. @@ -1053,6 +1072,17 @@ public class GnssNative { mGnssHal.injectNiSuplMessageData(data, length, slotIndex); } + /** + * Injects GNSS assistance data into the GNSS HAL. + */ + public void injectGnssAssistance(GnssAssistance assistance) { + if (!Flags.gnssAssistanceInterfaceJni()) { + return; + } + Preconditions.checkState(mRegistered); + mGnssHal.injectGnssAssistance(assistance); + } + @NativeEntryPoint void reportGnssServiceDied() { // Not necessary to clear (and restore) binder identity since it runs on another thread. @@ -1269,6 +1299,15 @@ public class GnssNative { } @NativeEntryPoint + void gnssAssistanceInjectRequest() { + if (!Flags.gnssAssistanceInterfaceJni() || mGnssAssistanceCallbacks == null) { + return; + } + Binder.withCleanCallingIdentity( + () -> mGnssAssistanceCallbacks.onRequestGnssAssistanceInject()); + } + + @NativeEntryPoint void reportGeofenceTransition(int geofenceId, Location location, int transition, long transitionTimestamp) { Binder.withCleanCallingIdentity( @@ -1569,6 +1608,10 @@ public class GnssNative { protected void injectNiSuplMessageData(byte[] data, int length, int slotIndex) { native_inject_ni_supl_message_data(data, length, slotIndex); } + + protected void injectGnssAssistance(GnssAssistance gnssAssistance) { + native_inject_gnss_assistance(gnssAssistance); + } } // basic APIs @@ -1718,4 +1761,7 @@ public class GnssNative { private static native boolean native_supports_psds(); private static native void native_inject_psds_data(byte[] data, int length, int psdsType); + + // GNSS Assistance APIs + private static native void native_inject_gnss_assistance(GnssAssistance gnssAssistance); } diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 66d04df8095b..adfabe1e54fd 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -169,7 +169,7 @@ cc_defaults { "android.hardware.broadcastradio@1.1", "android.hardware.contexthub@1.0", "android.hardware.common.fmq-V1-ndk", - "android.hardware.gnss-V3-cpp", + "android.hardware.gnss-V5-cpp", "android.hardware.gnss@1.0", "android.hardware.gnss@1.1", "android.hardware.gnss@2.0", @@ -204,6 +204,7 @@ cc_defaults { "android.system.suspend.control-V1-cpp", "android.system.suspend.control.internal-cpp", "android.system.suspend-V1-ndk", + "android_location_flags_c_lib", "server_configurable_flags", "service.incremental", ], diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 9c033e25c04e..93f6e95b6d5c 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -36,6 +36,7 @@ #include <android/hardware/gnss/BnGnssMeasurementCallback.h> #include <android/hardware/gnss/BnGnssPowerIndicationCallback.h> #include <android/hardware/gnss/BnGnssPsdsCallback.h> +#include <android_location_flags.h> #include <binder/IServiceManager.h> #include <nativehelper/JNIHelp.h> #include <pthread.h> @@ -53,6 +54,8 @@ #include "gnss/Gnss.h" #include "gnss/GnssAntennaInfo.h" #include "gnss/GnssAntennaInfoCallback.h" +#include "gnss/GnssAssistance.h" +#include "gnss/GnssAssistanceCallback.h" #include "gnss/GnssBatching.h" #include "gnss/GnssConfiguration.h" #include "gnss/GnssDebug.h" @@ -114,6 +117,7 @@ using android::hardware::gnss::GnssConstellationType; using android::hardware::gnss::GnssPowerStats; using android::hardware::gnss::IGnssPowerIndication; using android::hardware::gnss::IGnssPowerIndicationCallback; +using android::hardware::gnss::gnss_assistance::IGnssAssistanceCallback; using IGnssAidl = android::hardware::gnss::IGnss; using IGnssBatchingAidl = android::hardware::gnss::IGnssBatching; @@ -140,6 +144,9 @@ std::unique_ptr<android::gnss::GnssPsdsInterface> gnssPsdsIface = nullptr; std::unique_ptr<android::gnss::GnssVisibilityControlInterface> gnssVisibilityControlIface = nullptr; std::unique_ptr<android::gnss::MeasurementCorrectionsInterface> gnssMeasurementCorrectionsIface = nullptr; +std::unique_ptr<android::gnss::GnssAssistanceInterface> gnssAssistanceIface = nullptr; + +namespace location_flags = android::location::flags; namespace android { @@ -229,6 +236,9 @@ static void android_location_gnss_hal_GnssNative_class_init_once(JNIEnv* env, jc gnss::GnssVisibilityControl_class_init_once(env, clazz); gnss::MeasurementCorrections_class_init_once(env, clazz); gnss::MeasurementCorrectionsCallback_class_init_once(env, clazz); + if (location_flags::gnss_assistance_interface_jni()) { + gnss::GnssAssistance_class_init_once(env, clazz); + } gnss::Utils_class_init_once(env); } @@ -266,7 +276,9 @@ static void android_location_gnss_hal_GnssNative_init_once(JNIEnv* env, jobject gnssBatchingIface = gnssHal->getGnssBatchingInterface(); gnssVisibilityControlIface = gnssHal->getGnssVisibilityControlInterface(); gnssPowerIndicationIface = gnssHal->getGnssPowerIndicationInterface(); - + if (location_flags::gnss_assistance_interface_jni()) { + gnssAssistanceIface = gnssHal->getGnssAssistanceInterface(); + } if (mCallbacksObj) { ALOGE("Callbacks already initialized"); } else { @@ -355,13 +367,22 @@ static jboolean android_location_gnss_hal_GnssNative_init(JNIEnv* /* env */, jcl // Set IGnssPowerIndication.hal callback. if (gnssPowerIndicationIface != nullptr) { sp<IGnssPowerIndicationCallback> gnssPowerIndicationCallback = - new GnssPowerIndicationCallback(); + sp<GnssPowerIndicationCallback>::make(); auto status = gnssPowerIndicationIface->setCallback(gnssPowerIndicationCallback); if (!checkAidlStatus(status, "IGnssPowerIndication setCallback() failed.")) { gnssPowerIndicationIface = nullptr; } } + // Set IGnssAssistance callback. + if (gnssAssistanceIface != nullptr) { + sp<IGnssAssistanceCallback> gnssAssistanceCallback = + sp<gnss::GnssAssistanceCallback>::make(); + if (!gnssAssistanceIface->setCallback(gnssAssistanceCallback)) { + ALOGI("IGnssAssistanceInterface setCallback() failed"); + } + } + return JNI_TRUE; } @@ -493,6 +514,15 @@ static void android_location_gnss_hal_GnssNative_inject_psds_data(JNIEnv* env, j gnssPsdsIface->injectPsdsData(data, length, psdsType); } +static void android_location_gnss_hal_GnssNative_inject_gnss_assistance(JNIEnv* env, jclass, + jobject gnssAssistanceObj) { + if (gnssAssistanceIface == nullptr) { + ALOGE("%s: IGnssAssistance interface not available.", __func__); + return; + } + gnssAssistanceIface->injectGnssAssistance(env, gnssAssistanceObj); +} + static void android_location_GnssNetworkConnectivityHandler_agps_data_conn_open( JNIEnv* env, jobject /* obj */, jlong networkHandle, jstring apn, jint apnIpType) { if (apn == nullptr) { @@ -937,6 +967,8 @@ static const JNINativeMethod sLocationProviderMethods[] = { {"native_stop_nmea_message_collection", "()Z", reinterpret_cast<void*>( android_location_gnss_hal_GnssNative_stop_nmea_message_collection)}, + {"native_inject_gnss_assistance", "(Landroid/location/GnssAssistance;)V", + reinterpret_cast<void*>(android_location_gnss_hal_GnssNative_inject_gnss_assistance)}, }; static const JNINativeMethod sBatchingMethods[] = { diff --git a/services/core/jni/gnss/Android.bp b/services/core/jni/gnss/Android.bp index e72259f094bc..562e82f90bfa 100644 --- a/services/core/jni/gnss/Android.bp +++ b/services/core/jni/gnss/Android.bp @@ -17,7 +17,6 @@ cc_library_shared { "-Werror", "-Wno-unused-parameter", "-Wthread-safety", - "-DEGL_EGLEXT_PROTOTYPES", "-DGL_GLEXT_PROTOTYPES", ], @@ -41,6 +40,8 @@ cc_library_shared { "GnssMeasurementCallback.cpp", "GnssNavigationMessage.cpp", "GnssNavigationMessageCallback.cpp", + "GnssAssistance.cpp", + "GnssAssistanceCallback.cpp", "GnssPsds.cpp", "GnssPsdsCallback.cpp", "GnssVisibilityControl.cpp", @@ -61,7 +62,7 @@ cc_defaults { "libnativehelper", "libhardware_legacy", "libutils", - "android.hardware.gnss-V3-cpp", + "android.hardware.gnss-V5-cpp", "android.hardware.gnss@1.0", "android.hardware.gnss@1.1", "android.hardware.gnss@2.0", diff --git a/services/core/jni/gnss/Gnss.cpp b/services/core/jni/gnss/Gnss.cpp index da8928b5f97f..a3fd9aa79cfb 100644 --- a/services/core/jni/gnss/Gnss.cpp +++ b/services/core/jni/gnss/Gnss.cpp @@ -765,4 +765,15 @@ sp<hardware::gnss::V1_0::IGnssNi> GnssHal::getGnssNiInterface() { return nullptr; } +std::unique_ptr<GnssAssistanceInterface> GnssHal::getGnssAssistanceInterface() { + if (gnssHalAidl != nullptr) { + sp<hardware::gnss::gnss_assistance::IGnssAssistanceInterface> gnssAssistance; + auto status = gnssHalAidl->getExtensionGnssAssistanceInterface(&gnssAssistance); + if (checkAidlStatus(status, "Unable to get a handle to GnssAssistance")) { + return std::make_unique<GnssAssistanceInterface>(gnssAssistance); + } + } + return nullptr; +} + } // namespace android::gnss diff --git a/services/core/jni/gnss/Gnss.h b/services/core/jni/gnss/Gnss.h index 458da8a6e514..2b6b7513a231 100644 --- a/services/core/jni/gnss/Gnss.h +++ b/services/core/jni/gnss/Gnss.h @@ -34,6 +34,7 @@ #include "AGnss.h" #include "AGnssRil.h" #include "GnssAntennaInfo.h" +#include "GnssAssistance.h" #include "GnssBatching.h" #include "GnssCallback.h" #include "GnssConfiguration.h" @@ -115,6 +116,7 @@ public: std::unique_ptr<GnssVisibilityControlInterface> getGnssVisibilityControlInterface(); std::unique_ptr<GnssAntennaInfoInterface> getGnssAntennaInfoInterface(); std::unique_ptr<GnssPsdsInterface> getGnssPsdsInterface(); + std::unique_ptr<GnssAssistanceInterface> getGnssAssistanceInterface(); sp<hardware::gnss::IGnssPowerIndication> getGnssPowerIndicationInterface(); sp<hardware::gnss::V1_0::IGnssNi> getGnssNiInterface(); diff --git a/services/core/jni/gnss/GnssAssistance.cpp b/services/core/jni/gnss/GnssAssistance.cpp new file mode 100644 index 000000000000..fff396ea126a --- /dev/null +++ b/services/core/jni/gnss/GnssAssistance.cpp @@ -0,0 +1,2047 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Define LOG_TAG before <log/log.h> to overwrite the default value. + +#define LOG_TAG "GnssAssistanceJni" + +#include "GnssAssistance.h" + +#include <utils/String16.h> + +#include "GnssAssistanceCallback.h" +#include "Utils.h" + +namespace android::gnss { + +using GnssConstellationType = android::hardware::gnss::GnssConstellationType; +using GnssCorrectionComponent = android::hardware::gnss::gnss_assistance::GnssCorrectionComponent; +using GnssInterval = + android::hardware::gnss::gnss_assistance::GnssCorrectionComponent::GnssInterval; +using GnssSatelliteAlmanac = + android::hardware::gnss::gnss_assistance::GnssAlmanac::GnssSatelliteAlmanac; +using IonosphericCorrection = android::hardware::gnss::gnss_assistance::IonosphericCorrection; +using PseudorangeCorrection = + android::hardware::gnss::gnss_assistance::GnssCorrectionComponent::PseudorangeCorrection; +using GalileoSatelliteClockModel = android::hardware::gnss::gnss_assistance:: + GalileoSatelliteEphemeris::GalileoSatelliteClockModel; +using GalileoSvHealth = + android::hardware::gnss::gnss_assistance::GalileoSatelliteEphemeris::GalileoSvHealth; +using GlonassSatelliteAlmanac = + android::hardware::gnss::gnss_assistance::GlonassAlmanac::GlonassSatelliteAlmanac; +using GlonassSatelliteClockModel = android::hardware::gnss::gnss_assistance:: + GlonassSatelliteEphemeris::GlonassSatelliteClockModel; +using GlonassSatelliteOrbitModel = android::hardware::gnss::gnss_assistance:: + GlonassSatelliteEphemeris::GlonassSatelliteOrbitModel; +using GnssSignalType = hardware::gnss::GnssSignalType; +using GnssConstellationType = hardware::gnss::GnssConstellationType; +using BeidouB1CSatelliteOrbitType = + android::hardware::gnss::gnss_assistance::AuxiliaryInformation::BeidouB1CSatelliteOrbitType; +using QzssSatelliteEphemeris = android::hardware::gnss::gnss_assistance::QzssSatelliteEphemeris; + +// Implementation of GnssAssistance (AIDL HAL) + +namespace { +jmethodID method_gnssAssistanceGetGpsAssistance; +jmethodID method_gnssAssistanceGetGlonassAssistance; +jmethodID method_gnssAssistanceGetGalileoAssistance; +jmethodID method_gnssAssistanceGetBeidouAssistance; +jmethodID method_gnssAssistanceGetQzssAssistance; + +jmethodID method_listSize; +jmethodID method_listGet; + +jmethodID method_gnssAlmanacGetIssueDateMillis; +jmethodID method_gnssAlmanacGetIoda; +jmethodID method_gnssAlmanacGetWeekNumber; +jmethodID method_gnssAlmanacGetToaSeconds; +jmethodID method_gnssAlmanacGetSatelliteAlmanacs; +jmethodID method_gnssAlmanacIsCompleteAlmanacProvided; +jmethodID method_satelliteAlmanacGetSvid; +jmethodID method_satelliteAlmanacGetSvHealth; +jmethodID method_satelliteAlmanacGetAf0; +jmethodID method_satelliteAlmanacGetAf1; +jmethodID method_satelliteAlmanacGetEccentricity; +jmethodID method_satelliteAlmanacGetInclination; +jmethodID method_satelliteAlmanacGetM0; +jmethodID method_satelliteAlmanacGetOmega; +jmethodID method_satelliteAlmanacGetOmega0; +jmethodID method_satelliteAlmanacGetOmegaDot; +jmethodID method_satelliteAlmanacGetRootA; + +jmethodID method_satelliteEphemerisTimeGetIode; +jmethodID method_satelliteEphemerisTimeGetToeSeconds; +jmethodID method_satelliteEphemerisTimeGetWeekNumber; + +jmethodID method_keplerianOrbitModelGetDeltaN; +jmethodID method_keplerianOrbitModelGetEccentricity; +jmethodID method_keplerianOrbitModelGetI0; +jmethodID method_keplerianOrbitModelGetIDot; +jmethodID method_keplerianOrbitModelGetM0; +jmethodID method_keplerianOrbitModelGetOmega; +jmethodID method_keplerianOrbitModelGetOmega0; +jmethodID method_keplerianOrbitModelGetOmegaDot; +jmethodID method_keplerianOrbitModelGetRootA; +jmethodID method_keplerianOrbitModelGetSecondOrderHarmonicPerturbation; +jmethodID method_secondOrderHarmonicPerturbationGetCic; +jmethodID method_secondOrderHarmonicPerturbationGetCis; +jmethodID method_secondOrderHarmonicPerturbationGetCrc; +jmethodID method_secondOrderHarmonicPerturbationGetCrs; +jmethodID method_secondOrderHarmonicPerturbationGetCuc; +jmethodID method_secondOrderHarmonicPerturbationGetCus; + +jmethodID method_klobucharIonosphericModelGetAlpha0; +jmethodID method_klobucharIonosphericModelGetAlpha1; +jmethodID method_klobucharIonosphericModelGetAlpha2; +jmethodID method_klobucharIonosphericModelGetAlpha3; +jmethodID method_klobucharIonosphericModelGetBeta0; +jmethodID method_klobucharIonosphericModelGetBeta1; +jmethodID method_klobucharIonosphericModelGetBeta2; +jmethodID method_klobucharIonosphericModelGetBeta3; + +jmethodID method_utcModelGetA0; +jmethodID method_utcModelGetA1; +jmethodID method_utcModelGetTimeOfWeek; +jmethodID method_utcModelGetWeekNumber; + +jmethodID method_leapSecondsModelGetDayNumberLeapSecondsFuture; +jmethodID method_leapSecondsModelGetLeapSeconds; +jmethodID method_leapSecondsModelGetLeapSecondsFuture; +jmethodID method_leapSecondsModelGetWeekNumberLeapSecondsFuture; + +jmethodID method_timeModelsGetTimeOfWeek; +jmethodID method_timeModelsGetToGnss; +jmethodID method_timeModelsGetWeekNumber; +jmethodID method_timeModelsGetA0; +jmethodID method_timeModelsGetA1; + +jmethodID method_realTimeIntegrityModelGetBadSvid; +jmethodID method_realTimeIntegrityModelGetBadSignalTypes; +jmethodID method_realTimeIntegrityModelGetStartDateSeconds; +jmethodID method_realTimeIntegrityModelGetEndDateSeconds; +jmethodID method_realTimeIntegrityModelGetPublishDateSeconds; +jmethodID method_realTimeIntegrityModelGetAdvisoryNumber; +jmethodID method_realTimeIntegrityModelGetAdvisoryType; + +jmethodID method_gnssSignalTypeGetConstellationType; +jmethodID method_gnssSignalTypeGetCarrierFrequencyHz; +jmethodID method_gnssSignalTypeGetCodeType; + +jmethodID method_auxiliaryInformationGetSvid; +jmethodID method_auxiliaryInformationGetAvailableSignalTypes; +jmethodID method_auxiliaryInformationGetFrequencyChannelNumber; +jmethodID method_auxiliaryInformationGetSatType; + +jmethodID method_satelliteCorrectionGetSvid; +jmethodID method_satelliteCorrectionGetIonosphericCorrections; +jmethodID method_ionosphericCorrectionGetCarrierFrequencyHz; +jmethodID method_ionosphericCorrectionGetIonosphericCorrection; +jmethodID method_gnssCorrectionComponentGetPseudorangeCorrection; +jmethodID method_gnssCorrectionComponentGetSourceKey; +jmethodID method_gnssCorrectionComponentGetValidityInterval; +jmethodID method_pseudorangeCorrectionGetCorrectionMeters; +jmethodID method_pseudorangeCorrectionGetCorrectionUncertaintyMeters; +jmethodID method_pseudorangeCorrectionGetCorrectionRateMetersPerSecond; +jmethodID method_gnssIntervalGetStartMillisSinceGpsEpoch; +jmethodID method_gnssIntervalGetEndMillisSinceGpsEpoch; + +jmethodID method_gpsAssistanceGetAlmanac; +jmethodID method_gpsAssistanceGetIonosphericModel; +jmethodID method_gpsAssistanceGetUtcModel; +jmethodID method_gpsAssistanceGetLeapSecondsModel; +jmethodID method_gpsAssistanceGetTimeModels; +jmethodID method_gpsAssistanceGetSatelliteEphemeris; +jmethodID method_gpsAssistanceGetRealTimeIntegrityModels; +jmethodID method_gpsAssistanceGetSatelliteCorrections; +jmethodID method_gpsSatelliteEphemerisGetSvid; +jmethodID method_gpsSatelliteEphemerisGetGpsL2Params; +jmethodID method_gpsSatelliteEphemerisGetSatelliteClockModel; +jmethodID method_gpsSatelliteEphemerisGetSatelliteOrbitModel; +jmethodID method_gpsSatelliteEphemerisGetSatelliteHealth; +jmethodID method_gpsSatelliteEphemerisGetSatelliteEphemerisTime; +jmethodID method_gpsL2ParamsGetL2Code; +jmethodID method_gpsL2ParamsGetL2Flag; +jmethodID method_gpsSatelliteClockModelGetAf0; +jmethodID method_gpsSatelliteClockModelGetAf1; +jmethodID method_gpsSatelliteClockModelGetAf2; +jmethodID method_gpsSatelliteClockModelGetTgd; +jmethodID method_gpsSatelliteClockModelGetIodc; +jmethodID method_gpsSatelliteClockModelGetTimeOfClockSeconds; +jmethodID method_gpsSatelliteHealthGetFitInt; +jmethodID method_gpsSatelliteHealthGetSvAccur; +jmethodID method_gpsSatelliteHealthGetSvHealth; + +jmethodID method_beidouAssistanceGetAlmanac; +jmethodID method_beidouAssistanceGetIonosphericModel; +jmethodID method_beidouAssistanceGetUtcModel; +jmethodID method_beidouAssistanceGetLeapSecondsModel; +jmethodID method_beidouAssistanceGetTimeModels; +jmethodID method_beidouAssistanceGetSatelliteEphemeris; +jmethodID method_beidouAssistanceGetSatelliteCorrections; +jmethodID method_beidouAssistanceGetRealTimeIntegrityModels; +jmethodID method_beidouSatelliteEphemerisGetSvid; +jmethodID method_beidouSatelliteEphemerisGetSatelliteClockModel; +jmethodID method_beidouSatelliteEphemerisGetSatelliteOrbitModel; +jmethodID method_beidouSatelliteEphemerisGetSatelliteHealth; +jmethodID method_beidouSatelliteEphemerisGetSatelliteEphemerisTime; +jmethodID method_beidouSatelliteClockModelGetAf0; +jmethodID method_beidouSatelliteClockModelGetAf1; +jmethodID method_beidouSatelliteClockModelGetAf2; +jmethodID method_beidouSatelliteClockModelGetAodc; +jmethodID method_beidouSatelliteClockModelGetTgd1; +jmethodID method_beidouSatelliteClockModelGetTgd2; +jmethodID method_beidouSatelliteClockModelGetTimeOfClockSeconds; +jmethodID method_beidouSatelliteHealthGetSatH1; +jmethodID method_beidouSatelliteHealthGetSvAccur; +jmethodID method_beidouSatelliteEphemerisTimeGetIode; +jmethodID method_beidouSatelliteEphemerisTimeGetBeidouWeekNumber; +jmethodID method_beidouSatelliteEphemerisTimeGetToeSeconds; + +jmethodID method_galileoAssistanceGetAlmanac; +jmethodID method_galileoAssistanceGetIonosphericModel; +jmethodID method_galileoAssistanceGetUtcModel; +jmethodID method_galileoAssistanceGetLeapSecondsModel; +jmethodID method_galileoAssistanceGetTimeModels; +jmethodID method_galileoAssistanceGetSatelliteEphemeris; +jmethodID method_galileoAssistanceGetSatelliteCorrections; +jmethodID method_galileoAssistanceGetRealTimeIntegrityModels; +jmethodID method_galileoSatelliteEphemerisGetSvid; +jmethodID method_galileoSatelliteEphemerisGetSatelliteClockModels; +jmethodID method_galileoSatelliteEphemerisGetSatelliteOrbitModel; +jmethodID method_galileoSatelliteEphemerisGetSatelliteHealth; +jmethodID method_galileoSatelliteEphemerisGetSatelliteEphemerisTime; +jmethodID method_galileoSatelliteClockModelGetAf0; +jmethodID method_galileoSatelliteClockModelGetAf1; +jmethodID method_galileoSatelliteClockModelGetAf2; +jmethodID method_galileoSatelliteClockModelGetBgdSeconds; +jmethodID method_galileoSatelliteClockModelGetSatelliteClockType; +jmethodID method_galileoSatelliteClockModelGetSisaMeters; +jmethodID method_galileoSatelliteClockModelGetTimeOfClockSeconds; +jmethodID method_galileoSvHealthGetDataValidityStatusE1b; +jmethodID method_galileoSvHealthGetDataValidityStatusE5a; +jmethodID method_galileoSvHealthGetDataValidityStatusE5b; +jmethodID method_galileoSvHealthGetSignalHealthStatusE1b; +jmethodID method_galileoSvHealthGetSignalHealthStatusE5a; +jmethodID method_galileoSvHealthGetSignalHealthStatusE5b; +jmethodID method_galileoIonosphericModelGetAi0; +jmethodID method_galileoIonosphericModelGetAi1; +jmethodID method_galileoIonosphericModelGetAi2; + +jmethodID method_glonassAssistanceGetAlmanac; +jmethodID method_glonassAssistanceGetUtcModel; +jmethodID method_glonassAssistanceGetTimeModels; +jmethodID method_glonassAssistanceGetSatelliteEphemeris; +jmethodID method_glonassAssistanceGetSatelliteCorrections; +jmethodID method_glonassAlmanacGetIssueDateMillis; +jmethodID method_glonassAlmanacGetSatelliteAlmanacs; +jmethodID method_glonassSatelliteAlmanacGetDeltaI; +jmethodID method_glonassSatelliteAlmanacGetDeltaT; +jmethodID method_glonassSatelliteAlmanacGetDeltaTDot; +jmethodID method_glonassSatelliteAlmanacGetEccentricity; +jmethodID method_glonassSatelliteAlmanacGetFrequencyChannelNumber; +jmethodID method_glonassSatelliteAlmanacGetLambda; +jmethodID method_glonassSatelliteAlmanacGetOmega; +jmethodID method_glonassSatelliteAlmanacGetSlotNumber; +jmethodID method_glonassSatelliteAlmanacGetHealthState; +jmethodID method_glonassSatelliteAlmanacGetTLambda; +jmethodID method_glonassSatelliteAlmanacGetTau; +jmethodID method_glonassSatelliteAlmanacGetIsGlonassM; +jmethodID method_glonassSatelliteAlmanacGetCalendarDayNumber; +jmethodID method_glonassSatelliteEphemerisGetAgeInDays; +jmethodID method_glonassSatelliteEphemerisGetSatelliteClockModel; +jmethodID method_glonassSatelliteEphemerisGetSatelliteOrbitModel; +jmethodID method_glonassSatelliteEphemerisGetHealthState; +jmethodID method_glonassSatelliteEphemerisGetSlotNumber; +jmethodID method_glonassSatelliteEphemerisGetFrameTimeSeconds; +jmethodID method_glonassSatelliteEphemerisGetUpdateIntervalMinutes; +jmethodID method_glonassSatelliteEphemerisGetIsGlonassM; +jmethodID method_glonassSatelliteEphemerisGetIsUpdateIntervalOdd; + +jmethodID method_glonassSatelliteOrbitModelGetX; +jmethodID method_glonassSatelliteOrbitModelGetY; +jmethodID method_glonassSatelliteOrbitModelGetZ; +jmethodID method_glonassSatelliteOrbitModelGetXAccel; +jmethodID method_glonassSatelliteOrbitModelGetYAccel; +jmethodID method_glonassSatelliteOrbitModelGetZAccel; +jmethodID method_glonassSatelliteOrbitModelGetXDot; +jmethodID method_glonassSatelliteOrbitModelGetYDot; +jmethodID method_glonassSatelliteOrbitModelGetZDot; +jmethodID method_glonassSatelliteClockModelGetClockBias; +jmethodID method_glonassSatelliteClockModelGetFrequencyBias; +jmethodID method_glonassSatelliteClockModelGetFrequencyChannelNumber; +jmethodID method_glonassSatelliteClockModelGetTimeOfClockSeconds; + +jmethodID method_qzssAssistanceGetAlmanac; +jmethodID method_qzssAssistanceGetIonosphericModel; +jmethodID method_qzssAssistanceGetUtcModel; +jmethodID method_qzssAssistanceGetLeapSecondsModel; +jmethodID method_qzssAssistanceGetTimeModels; +jmethodID method_qzssAssistanceGetSatelliteEphemeris; +jmethodID method_qzssAssistanceGetSatelliteCorrections; +jmethodID method_qzssAssistanceGetRealTimeIntegrityModels; +jmethodID method_qzssSatelliteEphemerisGetSvid; +jmethodID method_qzssSatelliteEphemerisGetGpsL2Params; +jmethodID method_qzssSatelliteEphemerisGetSatelliteClockModel; +jmethodID method_qzssSatelliteEphemerisGetSatelliteOrbitModel; +jmethodID method_qzssSatelliteEphemerisGetSatelliteHealth; +jmethodID method_qzssSatelliteEphemerisGetSatelliteEphemerisTime; +jmethodID method_qzssSatelliteClockModelGetAf0; +jmethodID method_qzssSatelliteClockModelGetAf1; +jmethodID method_qzssSatelliteClockModelGetAf2; +jmethodID method_qzssSatelliteClockModelGetAodc; +jmethodID method_qzssSatelliteClockModelGetTgd1; +jmethodID method_qzssSatelliteClockModelGetTgd2; +jmethodID method_qzssSatelliteClockModelGetTimeOfClockSeconds; +} // namespace + +void GnssAssistance_class_init_once(JNIEnv* env, jclass clazz) { + // Get the methods of GnssAssistance class. + jclass gnssAssistanceClass = env->FindClass("android/location/GnssAssistance"); + + method_gnssAssistanceGetGpsAssistance = + env->GetMethodID(gnssAssistanceClass, "getGpsAssistance", + "()Landroid/location/GpsAssistance;"); + method_gnssAssistanceGetGlonassAssistance = + env->GetMethodID(gnssAssistanceClass, "getGlonassAssistance", + "()Landroid/location/GlonassAssistance;"); + method_gnssAssistanceGetGalileoAssistance = + env->GetMethodID(gnssAssistanceClass, "getGalileoAssistance", + "()Landroid/location/GalileoAssistance;"); + method_gnssAssistanceGetBeidouAssistance = + env->GetMethodID(gnssAssistanceClass, "getBeidouAssistance", + "()Landroid/location/BeidouAssistance;"); + method_gnssAssistanceGetQzssAssistance = + env->GetMethodID(gnssAssistanceClass, "getQzssAssistance", + "()Landroid/location/QzssAssistance;"); + + // Get the methods of List class. + jclass listClass = env->FindClass("java/util/List"); + + method_listSize = env->GetMethodID(listClass, "size", "()I"); + method_listGet = env->GetMethodID(listClass, "get", "(I)Ljava/lang/Object;"); + + // Get the methods of GnssAlmanac class. + jclass gnssAlmanacClass = env->FindClass("android/location/GnssAlmanac"); + + method_gnssAlmanacGetIssueDateMillis = + env->GetMethodID(gnssAlmanacClass, "getIssueDateMillis", "()J"); + method_gnssAlmanacGetIoda = env->GetMethodID(gnssAlmanacClass, "getIoda", "()I"); + method_gnssAlmanacGetWeekNumber = env->GetMethodID(gnssAlmanacClass, "getWeekNumber", "()I"); + method_gnssAlmanacGetToaSeconds = env->GetMethodID(gnssAlmanacClass, "getToaSeconds", "()I"); + method_gnssAlmanacGetSatelliteAlmanacs = + env->GetMethodID(gnssAlmanacClass, "getGnssSatelliteAlmanacs", "()Ljava/util/List;"); + method_gnssAlmanacIsCompleteAlmanacProvided = + env->GetMethodID(gnssAlmanacClass, "isCompleteAlmanacProvided", "()Z"); + + // Get the methods of SatelliteAlmanac class. + jclass satelliteAlmanacClass = + env->FindClass("android/location/GnssAlmanac$GnssSatelliteAlmanac"); + + method_satelliteAlmanacGetSvid = env->GetMethodID(satelliteAlmanacClass, "getSvid", "()I"); + method_satelliteAlmanacGetSvHealth = + env->GetMethodID(satelliteAlmanacClass, "getSvHealth", "()I"); + method_satelliteAlmanacGetAf0 = env->GetMethodID(satelliteAlmanacClass, "getAf0", "()D"); + method_satelliteAlmanacGetAf1 = env->GetMethodID(satelliteAlmanacClass, "getAf1", "()D"); + method_satelliteAlmanacGetEccentricity = + env->GetMethodID(satelliteAlmanacClass, "getEccentricity", "()D"); + method_satelliteAlmanacGetInclination = + env->GetMethodID(satelliteAlmanacClass, "getInclination", "()D"); + method_satelliteAlmanacGetM0 = env->GetMethodID(satelliteAlmanacClass, "getM0", "()D"); + method_satelliteAlmanacGetOmega = env->GetMethodID(satelliteAlmanacClass, "getOmega", "()D"); + method_satelliteAlmanacGetOmega0 = env->GetMethodID(satelliteAlmanacClass, "getOmega0", "()D"); + method_satelliteAlmanacGetOmegaDot = + env->GetMethodID(satelliteAlmanacClass, "getOmegaDot", "()D"); + method_satelliteAlmanacGetRootA = env->GetMethodID(satelliteAlmanacClass, "getRootA", "()D"); + + // Get the mothods of SatelliteEphemerisTime class. + jclass satelliteEphemerisTimeClass = env->FindClass("android/location/SatelliteEphemerisTime"); + + method_satelliteEphemerisTimeGetIode = + env->GetMethodID(satelliteEphemerisTimeClass, "getIode", "()I"); + method_satelliteEphemerisTimeGetToeSeconds = + env->GetMethodID(satelliteEphemerisTimeClass, "getToeSeconds", "()I"); + method_satelliteEphemerisTimeGetWeekNumber = + env->GetMethodID(satelliteEphemerisTimeClass, "getWeekNumber", "()I"); + + // Get the mothods of KeplerianOrbitModel class. + jclass keplerianOrbitModelClass = env->FindClass("android/location/KeplerianOrbitModel"); + + method_keplerianOrbitModelGetDeltaN = + env->GetMethodID(keplerianOrbitModelClass, "getDeltaN", "()D"); + method_keplerianOrbitModelGetEccentricity = + env->GetMethodID(keplerianOrbitModelClass, "getEccentricity", "()D"); + method_keplerianOrbitModelGetI0 = env->GetMethodID(keplerianOrbitModelClass, "getI0", "()D"); + method_keplerianOrbitModelGetIDot = + env->GetMethodID(keplerianOrbitModelClass, "getIDot", "()D"); + method_keplerianOrbitModelGetM0 = env->GetMethodID(keplerianOrbitModelClass, "getM0", "()D"); + method_keplerianOrbitModelGetOmega = + env->GetMethodID(keplerianOrbitModelClass, "getOmega", "()D"); + method_keplerianOrbitModelGetOmega0 = + env->GetMethodID(keplerianOrbitModelClass, "getOmega0", "()D"); + method_keplerianOrbitModelGetOmegaDot = + env->GetMethodID(keplerianOrbitModelClass, "getOmegaDot", "()D"); + method_keplerianOrbitModelGetRootA = + env->GetMethodID(keplerianOrbitModelClass, "getRootA", "()D"); + method_keplerianOrbitModelGetSecondOrderHarmonicPerturbation = + env->GetMethodID(keplerianOrbitModelClass, "getSecondOrderHarmonicPerturbation", + "()Landroid/location/" + "KeplerianOrbitModel$SecondOrderHarmonicPerturbation;"); + + // Get the methods of SecondOrderHarmonicPerturbation class. + jclass secondOrderHarmonicPerturbationClass = + env->FindClass("android/location/KeplerianOrbitModel$SecondOrderHarmonicPerturbation"); + + method_secondOrderHarmonicPerturbationGetCic = + env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCic", "()D"); + method_secondOrderHarmonicPerturbationGetCis = + env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCis", "()D"); + method_secondOrderHarmonicPerturbationGetCrc = + env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCrc", "()D"); + method_secondOrderHarmonicPerturbationGetCrs = + env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCrs", "()D"); + method_secondOrderHarmonicPerturbationGetCuc = + env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCuc", "()D"); + method_secondOrderHarmonicPerturbationGetCus = + env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCus", "()D"); + + // Get the methods of KlobucharIonosphericModel class. + jclass klobucharIonosphericModelClass = + env->FindClass("android/location/KlobucharIonosphericModel"); + + method_klobucharIonosphericModelGetAlpha0 = + env->GetMethodID(klobucharIonosphericModelClass, "getAlpha0", "()D"); + method_klobucharIonosphericModelGetAlpha1 = + env->GetMethodID(klobucharIonosphericModelClass, "getAlpha1", "()D"); + method_klobucharIonosphericModelGetAlpha2 = + env->GetMethodID(klobucharIonosphericModelClass, "getAlpha2", "()D"); + method_klobucharIonosphericModelGetAlpha3 = + env->GetMethodID(klobucharIonosphericModelClass, "getAlpha3", "()D"); + method_klobucharIonosphericModelGetBeta0 = + env->GetMethodID(klobucharIonosphericModelClass, "getBeta0", "()D"); + method_klobucharIonosphericModelGetBeta1 = + env->GetMethodID(klobucharIonosphericModelClass, "getBeta1", "()D"); + method_klobucharIonosphericModelGetBeta2 = + env->GetMethodID(klobucharIonosphericModelClass, "getBeta2", "()D"); + method_klobucharIonosphericModelGetBeta3 = + env->GetMethodID(klobucharIonosphericModelClass, "getBeta3", "()D"); + + // Get the methods of UtcModel class. + jclass utcModelClass = env->FindClass("android/location/UtcModel"); + + method_utcModelGetA0 = env->GetMethodID(utcModelClass, "getA0", "()D"); + method_utcModelGetA1 = env->GetMethodID(utcModelClass, "getA1", "()D"); + method_utcModelGetTimeOfWeek = env->GetMethodID(utcModelClass, "getTimeOfWeek", "()I"); + method_utcModelGetWeekNumber = env->GetMethodID(utcModelClass, "getWeekNumber", "()I"); + + // Get the methods of LeapSecondsModel class. + jclass leapSecondsModelClass = env->FindClass("android/location/LeapSecondsModel"); + + method_leapSecondsModelGetDayNumberLeapSecondsFuture = + env->GetMethodID(leapSecondsModelClass, "getDayNumberLeapSecondsFuture", "()I"); + method_leapSecondsModelGetLeapSeconds = + env->GetMethodID(leapSecondsModelClass, "getLeapSeconds", "()I"); + method_leapSecondsModelGetLeapSecondsFuture = + env->GetMethodID(leapSecondsModelClass, "getLeapSecondsFuture", "()I"); + method_leapSecondsModelGetWeekNumberLeapSecondsFuture = + env->GetMethodID(leapSecondsModelClass, "getWeekNumberLeapSecondsFuture", "()I"); + + // Get the methods of TimeModel class. + jclass timeModelsClass = env->FindClass("android/location/TimeModel"); + + method_timeModelsGetTimeOfWeek = env->GetMethodID(timeModelsClass, "getTimeOfWeek", "()I"); + method_timeModelsGetToGnss = env->GetMethodID(timeModelsClass, "getToGnss", "()I"); + method_timeModelsGetWeekNumber = env->GetMethodID(timeModelsClass, "getWeekNumber", "()I"); + method_timeModelsGetA0 = env->GetMethodID(timeModelsClass, "getA0", "()D"); + method_timeModelsGetA1 = env->GetMethodID(timeModelsClass, "getA1", "()D"); + + // Get the methods of AuxiliaryInformation class. + jclass auxiliaryInformationClass = env->FindClass("android/location/AuxiliaryInformation"); + + method_auxiliaryInformationGetSvid = + env->GetMethodID(auxiliaryInformationClass, "getSvid", "()I"); + method_auxiliaryInformationGetAvailableSignalTypes = + env->GetMethodID(auxiliaryInformationClass, "getAvailableSignalTypes", + "()Ljava/util/List;"); + method_auxiliaryInformationGetFrequencyChannelNumber = + env->GetMethodID(auxiliaryInformationClass, "getFrequencyChannelNumber", "()I"); + method_auxiliaryInformationGetSatType = + env->GetMethodID(auxiliaryInformationClass, "getSatType", "()I"); + + // Get the methods of RealTimeIntegrityModel + jclass realTimeIntegrityModelClass = env->FindClass("android/location/RealTimeIntegrityModel"); + + method_realTimeIntegrityModelGetBadSvid = + env->GetMethodID(realTimeIntegrityModelClass, "getBadSvid", "()I"); + method_realTimeIntegrityModelGetBadSignalTypes = + env->GetMethodID(realTimeIntegrityModelClass, "getBadSignalTypes", + "()Ljava/util/List;"); + method_realTimeIntegrityModelGetStartDateSeconds = + env->GetMethodID(realTimeIntegrityModelClass, "getStartDateSeconds", "()J"); + method_realTimeIntegrityModelGetEndDateSeconds = + env->GetMethodID(realTimeIntegrityModelClass, "getEndDateSeconds", "()J"); + method_realTimeIntegrityModelGetPublishDateSeconds = + env->GetMethodID(realTimeIntegrityModelClass, "getPublishDateSeconds", "()J"); + method_realTimeIntegrityModelGetAdvisoryNumber = + env->GetMethodID(realTimeIntegrityModelClass, "getAdvisoryNumber", + "()Ljava/lang/String;"); + method_realTimeIntegrityModelGetAdvisoryType = + env->GetMethodID(realTimeIntegrityModelClass, "getAdvisoryType", + "()Ljava/lang/String;"); + + // Get the methods of GnssSignalType class. + jclass gnssSignalTypeClass = env->FindClass("android/location/GnssSignalType"); + + method_gnssSignalTypeGetConstellationType = + env->GetMethodID(gnssSignalTypeClass, "getConstellationType", "()I"); + method_gnssSignalTypeGetCarrierFrequencyHz = + env->GetMethodID(gnssSignalTypeClass, "getCarrierFrequencyHz", "()D"); + method_gnssSignalTypeGetCodeType = + env->GetMethodID(gnssSignalTypeClass, "getCodeType", "()Ljava/lang/String;"); + + // Get the methods of SatelliteCorrection class. + jclass satelliteCorrectionClass = + env->FindClass("android/location/GnssAssistance$GnssSatelliteCorrections"); + + method_satelliteCorrectionGetSvid = + env->GetMethodID(satelliteCorrectionClass, "getSvid", "()I"); + method_satelliteCorrectionGetIonosphericCorrections = + env->GetMethodID(satelliteCorrectionClass, "getIonosphericCorrections", + "()Ljava/util/List;"); + + // Get the methods of IonosphericCorrection class. + jclass ionosphericCorrectionClass = env->FindClass("android/location/IonosphericCorrection"); + + method_ionosphericCorrectionGetCarrierFrequencyHz = + env->GetMethodID(ionosphericCorrectionClass, "getCarrierFrequencyHz", "()J"); + method_ionosphericCorrectionGetIonosphericCorrection = + env->GetMethodID(ionosphericCorrectionClass, "getIonosphericCorrection", + "()Landroid/location/GnssCorrectionComponent;"); + + // Get the methods of GnssCorrectionComponent class. + jclass gnssCorrectionComponentClass = + env->FindClass("android/location/GnssCorrectionComponent"); + + method_gnssCorrectionComponentGetPseudorangeCorrection = + env->GetMethodID(gnssCorrectionComponentClass, "getPseudorangeCorrection", + "()Landroid/location/GnssCorrectionComponent$PseudorangeCorrection;"); + method_gnssCorrectionComponentGetSourceKey = + env->GetMethodID(gnssCorrectionComponentClass, "getSourceKey", "()Ljava/lang/String;"); + method_gnssCorrectionComponentGetValidityInterval = + env->GetMethodID(gnssCorrectionComponentClass, "getValidityInterval", + "()Landroid/location/GnssCorrectionComponent$GnssInterval;"); + + // Get the methods of PseudorangeCorrection class. + jclass pseudorangeCorrectionClass = + env->FindClass("android/location/GnssCorrectionComponent$PseudorangeCorrection"); + + method_pseudorangeCorrectionGetCorrectionMeters = + env->GetMethodID(pseudorangeCorrectionClass, "getCorrectionMeters", "()D"); + method_pseudorangeCorrectionGetCorrectionRateMetersPerSecond = + env->GetMethodID(pseudorangeCorrectionClass, "getCorrectionRateMetersPerSecond", "()D"); + method_pseudorangeCorrectionGetCorrectionUncertaintyMeters = + env->GetMethodID(pseudorangeCorrectionClass, "getCorrectionUncertaintyMeters", "()D"); + + // Get the methods of GnssInterval class. + jclass gnssIntervalClass = + env->FindClass("android/location/GnssCorrectionComponent$GnssInterval"); + + method_gnssIntervalGetStartMillisSinceGpsEpoch = + env->GetMethodID(gnssIntervalClass, "getStartMillisSinceGpsEpoch", "()J"); + method_gnssIntervalGetEndMillisSinceGpsEpoch = + env->GetMethodID(gnssIntervalClass, "getEndMillisSinceGpsEpoch", "()J"); + + // Get the methods of GpsAssistance class. + jclass gpsAssistanceClass = env->FindClass("android/location/GpsAssistance"); + + method_gpsAssistanceGetAlmanac = + env->GetMethodID(gpsAssistanceClass, "getAlmanac", "()Landroid/location/GnssAlmanac;"); + method_gpsAssistanceGetIonosphericModel = + env->GetMethodID(gpsAssistanceClass, "getIonosphericModel", + "()Landroid/location/KlobucharIonosphericModel;"); + method_gpsAssistanceGetUtcModel = + env->GetMethodID(gpsAssistanceClass, "getUtcModel", "()Landroid/location/UtcModel;"); + method_gpsAssistanceGetLeapSecondsModel = + env->GetMethodID(gpsAssistanceClass, "getLeapSecondsModel", + "()Landroid/location/LeapSecondsModel;"); + method_gpsAssistanceGetTimeModels = + env->GetMethodID(gpsAssistanceClass, "getTimeModels", "()Ljava/util/List;"); + method_gpsAssistanceGetSatelliteEphemeris = + env->GetMethodID(gpsAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;"); + method_gpsAssistanceGetRealTimeIntegrityModels = + env->GetMethodID(gpsAssistanceClass, "getRealTimeIntegrityModels", + "()Ljava/util/List;"); + method_gpsAssistanceGetSatelliteCorrections = + env->GetMethodID(gpsAssistanceClass, "getSatelliteCorrections", "()Ljava/util/List;"); + + // Get the methods of GpsSatelliteEphemeris class. + jclass gpsSatelliteEphemerisClass = env->FindClass("android/location/GpsSatelliteEphemeris"); + + method_gpsSatelliteEphemerisGetSvid = + env->GetMethodID(gpsSatelliteEphemerisClass, "getSvid", "()I"); + method_gpsSatelliteEphemerisGetGpsL2Params = + env->GetMethodID(gpsSatelliteEphemerisClass, "getGpsL2Params", + "()Landroid/location/GpsSatelliteEphemeris$GpsL2Params;"); + method_gpsSatelliteEphemerisGetSatelliteClockModel = + env->GetMethodID(gpsSatelliteEphemerisClass, "getSatelliteClockModel", + "()Landroid/location/GpsSatelliteEphemeris$GpsSatelliteClockModel;"); + method_gpsSatelliteEphemerisGetSatelliteOrbitModel = + env->GetMethodID(gpsSatelliteEphemerisClass, "getSatelliteOrbitModel", + "()Landroid/location/KeplerianOrbitModel;"); + method_gpsSatelliteEphemerisGetSatelliteHealth = + env->GetMethodID(gpsSatelliteEphemerisClass, "getSatelliteHealth", + "()Landroid/location/GpsSatelliteEphemeris$GpsSatelliteHealth;"); + method_gpsSatelliteEphemerisGetSatelliteEphemerisTime = + env->GetMethodID(gpsSatelliteEphemerisClass, "getSatelliteEphemerisTime", + "()Landroid/location/SatelliteEphemerisTime;"); + + // Get the methods of GpsL2Params class. + jclass gpsL2ParamsClass = env->FindClass("android/location/GpsSatelliteEphemeris$GpsL2Params"); + method_gpsL2ParamsGetL2Code = env->GetMethodID(gpsL2ParamsClass, "getL2Code", "()I"); + method_gpsL2ParamsGetL2Flag = env->GetMethodID(gpsL2ParamsClass, "getL2Flag", "()I"); + + // Get the methods of GpsSatelliteClockModel class. + jclass gpsSatelliteClockModelClass = + env->FindClass("android/location/GpsSatelliteEphemeris$GpsSatelliteClockModel"); + method_gpsSatelliteClockModelGetAf0 = + env->GetMethodID(gpsSatelliteClockModelClass, "getAf0", "()D"); + method_gpsSatelliteClockModelGetAf1 = + env->GetMethodID(gpsSatelliteClockModelClass, "getAf1", "()D"); + method_gpsSatelliteClockModelGetAf2 = + env->GetMethodID(gpsSatelliteClockModelClass, "getAf2", "()D"); + method_gpsSatelliteClockModelGetTgd = + env->GetMethodID(gpsSatelliteClockModelClass, "getTgd", "()D"); + method_gpsSatelliteClockModelGetIodc = + env->GetMethodID(gpsSatelliteClockModelClass, "getIodc", "()I"); + method_gpsSatelliteClockModelGetTimeOfClockSeconds = + env->GetMethodID(gpsSatelliteClockModelClass, "getTimeOfClockSeconds", "()J"); + + // Get the methods of GpsSatelliteHealth class. + jclass gpsSatelliteHealthClass = + env->FindClass("android/location/GpsSatelliteEphemeris$GpsSatelliteHealth"); + method_gpsSatelliteHealthGetFitInt = + env->GetMethodID(gpsSatelliteHealthClass, "getFitInt", "()D"); + method_gpsSatelliteHealthGetSvAccur = + env->GetMethodID(gpsSatelliteHealthClass, "getSvAccur", "()D"); + method_gpsSatelliteHealthGetSvHealth = + env->GetMethodID(gpsSatelliteHealthClass, "getSvHealth", "()I"); + + // Get the methods of BeidouAssistance class. + jclass beidouAssistanceClass = env->FindClass("android/location/BeidouAssistance"); + method_beidouAssistanceGetAlmanac = env->GetMethodID(beidouAssistanceClass, "getAlmanac", + "()Landroid/location/GnssAlmanac;"); + method_beidouAssistanceGetIonosphericModel = + env->GetMethodID(beidouAssistanceClass, "getIonosphericModel", + "()Landroid/location/KlobucharIonosphericModel;"); + method_beidouAssistanceGetUtcModel = + env->GetMethodID(beidouAssistanceClass, "getUtcModel", "()Landroid/location/UtcModel;"); + method_beidouAssistanceGetLeapSecondsModel = + env->GetMethodID(beidouAssistanceClass, "getLeapSecondsModel", + "()Landroid/location/LeapSecondsModel;"); + method_beidouAssistanceGetTimeModels = + env->GetMethodID(beidouAssistanceClass, "getTimeModels", "()Ljava/util/List;"); + method_beidouAssistanceGetSatelliteEphemeris = + env->GetMethodID(beidouAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;"); + method_beidouAssistanceGetSatelliteCorrections = + env->GetMethodID(beidouAssistanceClass, "getSatelliteCorrections", + "()Ljava/util/List;"); + method_beidouAssistanceGetRealTimeIntegrityModels = + env->GetMethodID(beidouAssistanceClass, "getRealTimeIntegrityModels", + "()Ljava/util/List;"); + + // Get the methods of BeidouSatelliteEphemeris class. + jclass beidouSatelliteEphemerisClass = + env->FindClass("android/location/BeidouSatelliteEphemeris"); + method_beidouSatelliteEphemerisGetSvid = + env->GetMethodID(beidouSatelliteEphemerisClass, "getSvid", "()I"); + method_beidouSatelliteEphemerisGetSatelliteClockModel = + env->GetMethodID(beidouSatelliteEphemerisClass, "getSatelliteClockModel", + "()Landroid/location/" + "BeidouSatelliteEphemeris$BeidouSatelliteClockModel;"); + method_beidouSatelliteEphemerisGetSatelliteOrbitModel = + env->GetMethodID(beidouSatelliteEphemerisClass, "getSatelliteOrbitModel", + "()Landroid/location/KeplerianOrbitModel;"); + method_beidouSatelliteEphemerisGetSatelliteHealth = + env->GetMethodID(beidouSatelliteEphemerisClass, "getSatelliteHealth", + "()Landroid/location/BeidouSatelliteEphemeris$BeidouSatelliteHealth;"); + method_beidouSatelliteEphemerisGetSatelliteEphemerisTime = + env->GetMethodID(beidouSatelliteEphemerisClass, "getSatelliteEphemerisTime", + "()Landroid/location/" + "BeidouSatelliteEphemeris$BeidouSatelliteEphemerisTime;"); + + // Get the methods of BeidouSatelliteClockModel + jclass beidouSatelliteClockModelClass = + env->FindClass("android/location/BeidouSatelliteEphemeris$BeidouSatelliteClockModel"); + method_beidouSatelliteClockModelGetAf0 = + env->GetMethodID(beidouSatelliteClockModelClass, "getAf0", "()D"); + method_beidouSatelliteClockModelGetAf1 = + env->GetMethodID(beidouSatelliteClockModelClass, "getAf1", "()D"); + method_beidouSatelliteClockModelGetAf2 = + env->GetMethodID(beidouSatelliteClockModelClass, "getAf2", "()D"); + method_beidouSatelliteClockModelGetAodc = + env->GetMethodID(beidouSatelliteClockModelClass, "getAodc", "()I"); + method_beidouSatelliteClockModelGetTgd1 = + env->GetMethodID(beidouSatelliteClockModelClass, "getTgd1", "()D"); + method_beidouSatelliteClockModelGetTgd2 = + env->GetMethodID(beidouSatelliteClockModelClass, "getTgd2", "()D"); + method_beidouSatelliteClockModelGetTimeOfClockSeconds = + env->GetMethodID(beidouSatelliteClockModelClass, "getTimeOfClockSeconds", "()J"); + + // Get the methods of BeidouSatelliteHealth + jclass beidouSatelliteHealthClass = + env->FindClass("android/location/BeidouSatelliteEphemeris$BeidouSatelliteHealth"); + method_beidouSatelliteHealthGetSatH1 = + env->GetMethodID(beidouSatelliteHealthClass, "getSatH1", "()I"); + method_beidouSatelliteHealthGetSvAccur = + env->GetMethodID(beidouSatelliteHealthClass, "getSvAccur", "()D"); + + // Get the methods of BeidouSatelliteEphemerisTime + jclass beidouSatelliteEphemerisTimeClass = env->FindClass( + "android/location/BeidouSatelliteEphemeris$BeidouSatelliteEphemerisTime"); + method_beidouSatelliteEphemerisTimeGetIode = + env->GetMethodID(beidouSatelliteEphemerisTimeClass, "getIode", "()I"); + method_beidouSatelliteEphemerisTimeGetBeidouWeekNumber = + env->GetMethodID(beidouSatelliteEphemerisTimeClass, "getBeidouWeekNumber", "()I"); + method_beidouSatelliteEphemerisTimeGetToeSeconds = + env->GetMethodID(beidouSatelliteEphemerisTimeClass, "getToeSeconds", "()I"); + + // Get the methods of GalileoAssistance class. + jclass galileoAssistanceClass = env->FindClass("android/location/GalileoAssistance"); + method_galileoAssistanceGetAlmanac = env->GetMethodID(galileoAssistanceClass, "getAlmanac", + "()Landroid/location/GnssAlmanac;"); + method_galileoAssistanceGetIonosphericModel = + env->GetMethodID(galileoAssistanceClass, "getIonosphericModel", + "()Landroid/location/KlobucharIonosphericModel;"); + method_galileoAssistanceGetUtcModel = env->GetMethodID(galileoAssistanceClass, "getUtcModel", + "()Landroid/location/UtcModel;"); + method_galileoAssistanceGetLeapSecondsModel = + env->GetMethodID(galileoAssistanceClass, "getLeapSecondsModel", + "()Landroid/location/LeapSecondsModel;"); + method_galileoAssistanceGetTimeModels = + env->GetMethodID(galileoAssistanceClass, "getTimeModels", "()Ljava/util/List;"); + method_galileoAssistanceGetSatelliteEphemeris = + env->GetMethodID(galileoAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;"); + method_galileoAssistanceGetSatelliteCorrections = + env->GetMethodID(galileoAssistanceClass, "getSatelliteCorrections", + "()Ljava/util/List;"); + method_galileoAssistanceGetRealTimeIntegrityModels = + env->GetMethodID(galileoAssistanceClass, "getRealTimeIntegrityModels", + "()Ljava/util/List;"); + + // Get the methods of GalileoSatelliteEphemeris class + jclass galileoSatelliteEphemerisClass = + env->FindClass("android/location/GalileoSatelliteEphemeris"); + method_galileoSatelliteEphemerisGetSatelliteClockModels = + env->GetMethodID(galileoSatelliteEphemerisClass, "getSatelliteClockModels", + "()Ljava/util/List;"); + method_galileoSatelliteEphemerisGetSvid = + env->GetMethodID(galileoSatelliteEphemerisClass, "getSvid", "()I"); + method_galileoSatelliteEphemerisGetSatelliteEphemerisTime = + env->GetMethodID(galileoSatelliteEphemerisClass, "getSatelliteEphemerisTime", + "()Landroid/location/SatelliteEphemerisTime;"); + method_galileoSatelliteEphemerisGetSatelliteHealth = + env->GetMethodID(galileoSatelliteEphemerisClass, "getSatelliteHealth", + "()Landroid/location/GalileoSatelliteEphemeris$GalileoSvHealth;"); + method_galileoSatelliteEphemerisGetSatelliteOrbitModel = + env->GetMethodID(galileoSatelliteEphemerisClass, "getSatelliteOrbitModel", + "()Landroid/location/KeplerianOrbitModel;"); + + // Get the methods of GalileoSatelliteClockModel class. + jclass galileoSatelliteClockModelClass = + env->FindClass("android/location/GalileoSatelliteEphemeris$GalileoSatelliteClockModel"); + method_galileoSatelliteClockModelGetAf0 = + env->GetMethodID(galileoSatelliteClockModelClass, "getAf0", "()D"); + method_galileoSatelliteClockModelGetAf1 = + env->GetMethodID(galileoSatelliteClockModelClass, "getAf1", "()D"); + method_galileoSatelliteClockModelGetAf2 = + env->GetMethodID(galileoSatelliteClockModelClass, "getAf2", "()D"); + method_galileoSatelliteClockModelGetBgdSeconds = + env->GetMethodID(galileoSatelliteClockModelClass, "getBgdSeconds", "()D"); + method_galileoSatelliteClockModelGetSatelliteClockType = + env->GetMethodID(galileoSatelliteClockModelClass, "getSatelliteClockType", "()I"); + method_galileoSatelliteClockModelGetSisaMeters = + env->GetMethodID(galileoSatelliteClockModelClass, "getSisaMeters", "()D"); + method_galileoSatelliteClockModelGetTimeOfClockSeconds = + env->GetMethodID(galileoSatelliteClockModelClass, "getTimeOfClockSeconds", "()J"); + + // Get the methods of GalileoSvHealth class. + jclass galileoSvHealthClass = + env->FindClass("android/location/GalileoSatelliteEphemeris$GalileoSvHealth"); + method_galileoSvHealthGetDataValidityStatusE1b = + env->GetMethodID(galileoSvHealthClass, "getDataValidityStatusE1b", "()I"); + method_galileoSvHealthGetDataValidityStatusE5a = + env->GetMethodID(galileoSvHealthClass, "getDataValidityStatusE5a", "()I"); + method_galileoSvHealthGetDataValidityStatusE5b = + env->GetMethodID(galileoSvHealthClass, "getDataValidityStatusE5b", "()I"); + method_galileoSvHealthGetSignalHealthStatusE1b = + env->GetMethodID(galileoSvHealthClass, "getSignalHealthStatusE1b", "()I"); + method_galileoSvHealthGetSignalHealthStatusE5a = + env->GetMethodID(galileoSvHealthClass, "getSignalHealthStatusE5a", "()I"); + method_galileoSvHealthGetSignalHealthStatusE5b = + env->GetMethodID(galileoSvHealthClass, "getSignalHealthStatusE5b", "()I"); + + // Get the methods of GalileoIonosphericModel class. + jclass galileoIonosphericModelClass = + env->FindClass("android/location/GalileoIonosphericModel"); + method_galileoIonosphericModelGetAi0 = + env->GetMethodID(galileoIonosphericModelClass, "getAi0", "()D"); + method_galileoIonosphericModelGetAi1 = + env->GetMethodID(galileoIonosphericModelClass, "getAi1", "()D"); + method_galileoIonosphericModelGetAi2 = + env->GetMethodID(galileoIonosphericModelClass, "getAi2", "()D"); + + // Get the methods of GlonassAssistance class. + jclass glonassAssistanceClass = env->FindClass("android/location/GlonassAssistance"); + method_glonassAssistanceGetAlmanac = env->GetMethodID(glonassAssistanceClass, "getAlmanac", + "()Landroid/location/GlonassAlmanac;"); + method_glonassAssistanceGetUtcModel = env->GetMethodID(glonassAssistanceClass, "getUtcModel", + "()Landroid/location/UtcModel;"); + method_glonassAssistanceGetTimeModels = + env->GetMethodID(glonassAssistanceClass, "getTimeModels", "()Ljava/util/List;"); + method_glonassAssistanceGetSatelliteEphemeris = + env->GetMethodID(glonassAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;"); + method_glonassAssistanceGetSatelliteCorrections = + env->GetMethodID(glonassAssistanceClass, "getSatelliteCorrections", + "()Ljava/util/List;"); + + // Get the methods of GlonassAlmanac class. + jclass glonassAlmanacClass = env->FindClass("android/location/GlonassAlmanac"); + method_glonassAlmanacGetIssueDateMillis = + env->GetMethodID(glonassAlmanacClass, "getIssueDateMillis", "()J"); + method_glonassAlmanacGetSatelliteAlmanacs = + env->GetMethodID(glonassAlmanacClass, "getSatelliteAlmanacs", "()Ljava/util/List;"); + + // Get the methods of GlonassSatelliteAlmanac class + jclass glonassSatelliteAlmanacClass = + env->FindClass("android/location/GlonassAlmanac$GlonassSatelliteAlmanac"); + method_glonassSatelliteAlmanacGetDeltaI = + env->GetMethodID(glonassSatelliteAlmanacClass, "getDeltaI", "()D"); + method_glonassSatelliteAlmanacGetDeltaT = + env->GetMethodID(glonassSatelliteAlmanacClass, "getDeltaT", "()D"); + method_glonassSatelliteAlmanacGetDeltaTDot = + env->GetMethodID(glonassSatelliteAlmanacClass, "getDeltaTDot", "()D"); + method_glonassSatelliteAlmanacGetEccentricity = + env->GetMethodID(glonassSatelliteAlmanacClass, "getEccentricity", "()D"); + method_glonassSatelliteAlmanacGetFrequencyChannelNumber = + env->GetMethodID(glonassSatelliteAlmanacClass, "getFrequencyChannelNumber", "()I"); + method_glonassSatelliteAlmanacGetLambda = + env->GetMethodID(glonassSatelliteAlmanacClass, "getLambda", "()D"); + method_glonassSatelliteAlmanacGetOmega = + env->GetMethodID(glonassSatelliteAlmanacClass, "getOmega", "()D"); + method_glonassSatelliteAlmanacGetSlotNumber = + env->GetMethodID(glonassSatelliteAlmanacClass, "getSlotNumber", "()I"); + method_glonassSatelliteAlmanacGetHealthState = + env->GetMethodID(glonassSatelliteAlmanacClass, "getHealthState", "()I"); + method_glonassSatelliteAlmanacGetTLambda = + env->GetMethodID(glonassSatelliteAlmanacClass, "getTLambda", "()D"); + method_glonassSatelliteAlmanacGetTau = + env->GetMethodID(glonassSatelliteAlmanacClass, "getTau", "()D"); + method_glonassSatelliteAlmanacGetCalendarDayNumber = + env->GetMethodID(glonassSatelliteAlmanacClass, "getCalendarDayNumber", "()I"); + method_glonassSatelliteAlmanacGetIsGlonassM = + env->GetMethodID(glonassSatelliteAlmanacClass, "isGlonassM", "()Z"); + + // Get the methods of GlonassSatelliteEphemeris + jclass glonassSatelliteEphemerisClass = + env->FindClass("android/location/GlonassSatelliteEphemeris"); + method_glonassSatelliteEphemerisGetAgeInDays = + env->GetMethodID(glonassSatelliteEphemerisClass, "getAgeInDays", "()I"); + method_glonassSatelliteEphemerisGetFrameTimeSeconds = + env->GetMethodID(glonassSatelliteEphemerisClass, "getFrameTimeSeconds", "()D"); + method_glonassSatelliteEphemerisGetHealthState = + env->GetMethodID(glonassSatelliteEphemerisClass, "getHealthState", "()I"); + method_glonassSatelliteEphemerisGetSlotNumber = + env->GetMethodID(glonassSatelliteEphemerisClass, "getSlotNumber", "()I"); + method_glonassSatelliteEphemerisGetSatelliteClockModel = + env->GetMethodID(glonassSatelliteEphemerisClass, "getSatelliteClockModel", + "()Landroid/location/" + "GlonassSatelliteEphemeris$GlonassSatelliteClockModel;"); + method_glonassSatelliteEphemerisGetSatelliteOrbitModel = + env->GetMethodID(glonassSatelliteEphemerisClass, "getSatelliteOrbitModel", + "()Landroid/location/" + "GlonassSatelliteEphemeris$GlonassSatelliteOrbitModel;"); + method_glonassSatelliteEphemerisGetUpdateIntervalMinutes = + env->GetMethodID(glonassSatelliteEphemerisClass, "getUpdateIntervalMinutes", "()I"); + method_glonassSatelliteEphemerisGetIsGlonassM = + env->GetMethodID(glonassSatelliteEphemerisClass, "isGlonassM", "()Z"); + method_glonassSatelliteEphemerisGetIsUpdateIntervalOdd = + env->GetMethodID(glonassSatelliteEphemerisClass, "isUpdateIntervalOdd", "()Z"); + + // Get the methods of GlonassSatelliteOrbitModel + jclass glonassSatelliteOrbitModelClass = + env->FindClass("android/location/GlonassSatelliteEphemeris$GlonassSatelliteOrbitModel"); + method_glonassSatelliteOrbitModelGetX = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getX", "()D"); + method_glonassSatelliteOrbitModelGetXAccel = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getXAccel", "()D"); + method_glonassSatelliteOrbitModelGetXDot = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getXDot", "()D"); + method_glonassSatelliteOrbitModelGetY = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getY", "()D"); + method_glonassSatelliteOrbitModelGetYAccel = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getYAccel", "()D"); + method_glonassSatelliteOrbitModelGetYDot = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getYDot", "()D"); + method_glonassSatelliteOrbitModelGetZ = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getZ", "()D"); + method_glonassSatelliteOrbitModelGetZAccel = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getZAccel", "()D"); + method_glonassSatelliteOrbitModelGetZDot = + env->GetMethodID(glonassSatelliteOrbitModelClass, "getZDot", "()D"); + + // Get the methods of GlonassSatelliteClockModel + jclass glonassSatelliteClockModelClass = + env->FindClass("android/location/GlonassSatelliteEphemeris$GlonassSatelliteClockModel"); + method_glonassSatelliteClockModelGetClockBias = + env->GetMethodID(glonassSatelliteClockModelClass, "getClockBias", "()D"); + method_glonassSatelliteClockModelGetFrequencyBias = + env->GetMethodID(glonassSatelliteClockModelClass, "getFrequencyBias", "()D"); + method_glonassSatelliteClockModelGetFrequencyChannelNumber = + env->GetMethodID(glonassSatelliteClockModelClass, "getFrequencyChannelNumber", "()I"); + method_glonassSatelliteClockModelGetTimeOfClockSeconds = + env->GetMethodID(glonassSatelliteClockModelClass, "getTimeOfClockSeconds", "()J"); + + // Get the methods of QzssAssistance class. + jclass qzssAssistanceClass = env->FindClass("android/location/QzssAssistance"); + method_qzssAssistanceGetAlmanac = + env->GetMethodID(qzssAssistanceClass, "getAlmanac", "()Landroid/location/GnssAlmanac;"); + method_qzssAssistanceGetIonosphericModel = + env->GetMethodID(qzssAssistanceClass, "getIonosphericModel", + "()Landroid/location/KlobucharIonosphericModel;"); + method_qzssAssistanceGetUtcModel = + env->GetMethodID(qzssAssistanceClass, "getUtcModel", "()Landroid/location/UtcModel;"); + method_qzssAssistanceGetLeapSecondsModel = + env->GetMethodID(qzssAssistanceClass, "getLeapSecondsModel", + "()Landroid/location/LeapSecondsModel;"); + method_qzssAssistanceGetTimeModels = + env->GetMethodID(qzssAssistanceClass, "getTimeModels", "()Ljava/util/List;"); + method_qzssAssistanceGetSatelliteEphemeris = + env->GetMethodID(qzssAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;"); + method_qzssAssistanceGetSatelliteCorrections = + env->GetMethodID(qzssAssistanceClass, "getSatelliteCorrections", "()Ljava/util/List;"); + + // Get the methods of QzssSatelliteEphemeris class. + jclass qzssSatelliteEphemerisClass = env->FindClass("android/location/QzssSatelliteEphemeris"); + method_qzssSatelliteEphemerisGetSvid = + env->GetMethodID(qzssSatelliteEphemerisClass, "getSvid", "()I"); + method_qzssSatelliteEphemerisGetGpsL2Params = + env->GetMethodID(qzssSatelliteEphemerisClass, "getGpsL2Params", + "()Landroid/location/GpsSatelliteEphemeris$GpsL2Params;"); + method_qzssSatelliteEphemerisGetSatelliteEphemerisTime = + env->GetMethodID(qzssSatelliteEphemerisClass, "getSatelliteEphemerisTime", + "()Landroid/location/SatelliteEphemerisTime;"); + method_qzssSatelliteEphemerisGetSatelliteHealth = + env->GetMethodID(qzssSatelliteEphemerisClass, "getSatelliteHealth", + "()Landroid/location/GpsSatelliteEphemeris$GpsSatelliteHealth;"); + method_qzssSatelliteEphemerisGetSatelliteOrbitModel = + env->GetMethodID(qzssSatelliteEphemerisClass, "getSatelliteOrbitModel", + "()Landroid/location/KeplerianOrbitModel;"); +} + +GnssAssistanceInterface::GnssAssistanceInterface( + const sp<IGnssAssistanceInterface>& iGnssAssistance) + : mGnssAssistanceInterface(iGnssAssistance) { + assert(mGnssAssistanceInterface != nullptr); +} + +jboolean GnssAssistanceInterface::injectGnssAssistance(JNIEnv* env, jobject gnssAssistanceObj) { + GnssAssistance gnssAssistance; + GnssAssistanceUtil::setGnssAssistance(env, gnssAssistanceObj, gnssAssistance); + auto status = mGnssAssistanceInterface->injectGnssAssistance(gnssAssistance); + return checkAidlStatus(status, "IGnssAssistanceInterface injectGnssAssistance() failed."); +} + +jboolean GnssAssistanceInterface::setCallback(const sp<IGnssAssistanceCallback>& callback) { + auto status = mGnssAssistanceInterface->setCallback(callback); + return checkAidlStatus(status, "IGnssAssistanceInterface setCallback() failed."); +} + +void GnssAssistanceUtil::setGnssAssistance(JNIEnv* env, jobject gnssAssistanceObj, + GnssAssistance& gnssAssistance) { + jobject gpsAssistanceObj = + env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetGpsAssistance); + jobject glonassAssistanceObj = + env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetGlonassAssistance); + jobject qzssAssistanceObj = + env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetQzssAssistance); + jobject galileoAssistanceObj = + env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetGalileoAssistance); + jobject beidouAssistanceObj = + env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetBeidouAssistance); + GnssAssistanceUtil::setGpsAssistance(env, gpsAssistanceObj, gnssAssistance.gpsAssistance); + GnssAssistanceUtil::setGlonassAssistance(env, glonassAssistanceObj, + gnssAssistance.glonassAssistance); + GnssAssistanceUtil::setQzssAssistance(env, qzssAssistanceObj, gnssAssistance.qzssAssistance); + GnssAssistanceUtil::setGalileoAssistance(env, galileoAssistanceObj, + gnssAssistance.galileoAssistance); + GnssAssistanceUtil::setBeidouAssistance(env, beidouAssistanceObj, + gnssAssistance.beidouAssistance); + env->DeleteLocalRef(gpsAssistanceObj); + env->DeleteLocalRef(glonassAssistanceObj); + env->DeleteLocalRef(qzssAssistanceObj); + env->DeleteLocalRef(galileoAssistanceObj); + env->DeleteLocalRef(beidouAssistanceObj); +} + +void GnssAssistanceUtil::setQzssAssistance(JNIEnv* env, jobject qzssAssistanceObj, + QzssAssistance& qzssAssistance) { + jobject qzssAlmanacObj = + env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetAlmanac); + jobject qzssIonosphericModelObj = + env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetIonosphericModel); + jobject qzssUtcModelObj = + env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetUtcModel); + jobject qzssLeapSecondsModelObj = + env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetLeapSecondsModel); + jobject qzssTimeModelsObj = + env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetTimeModels); + jobject qzssSatelliteEphemerisObj = + env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetSatelliteEphemeris); + jobject qzssSatelliteCorrectionsObj = + env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetSatelliteCorrections); + setGnssAlmanac(env, qzssAlmanacObj, qzssAssistance.almanac); + setKlobucharIonosphericModel(env, qzssIonosphericModelObj, qzssAssistance.ionosphericModel); + setUtcModel(env, qzssUtcModelObj, qzssAssistance.utcModel); + setLeapSecondsModel(env, qzssLeapSecondsModelObj, qzssAssistance.leapSecondsModel); + setTimeModels(env, qzssTimeModelsObj, qzssAssistance.timeModels); + setGpsOrQzssSatelliteEphemeris<QzssSatelliteEphemeris>(env, qzssSatelliteEphemerisObj, + qzssAssistance.satelliteEphemeris); + setSatelliteCorrections(env, qzssSatelliteCorrectionsObj, qzssAssistance.satelliteCorrections); + env->DeleteLocalRef(qzssAlmanacObj); + env->DeleteLocalRef(qzssIonosphericModelObj); + env->DeleteLocalRef(qzssUtcModelObj); + env->DeleteLocalRef(qzssLeapSecondsModelObj); + env->DeleteLocalRef(qzssTimeModelsObj); + env->DeleteLocalRef(qzssSatelliteEphemerisObj); + env->DeleteLocalRef(qzssSatelliteCorrectionsObj); +} + +void GnssAssistanceUtil::setGlonassAssistance(JNIEnv* env, jobject glonassAssistanceObj, + GlonassAssistance& galileoAssistance) { + jobject glonassAlmanacObj = + env->CallObjectMethod(glonassAssistanceObj, method_glonassAssistanceGetAlmanac); + jobject utcModelObj = + env->CallObjectMethod(glonassAssistanceObj, method_glonassAssistanceGetUtcModel); + jobject timeModelsObj = + env->CallObjectMethod(glonassAssistanceObj, method_glonassAssistanceGetTimeModels); + jobject satelliteEphemerisObj = + env->CallObjectMethod(glonassAssistanceObj, + method_glonassAssistanceGetSatelliteEphemeris); + jobject satelliteCorrectionsObj = + env->CallObjectMethod(glonassAssistanceObj, + method_glonassAssistanceGetSatelliteCorrections); + setGlonassAlmanac(env, glonassAlmanacObj, galileoAssistance.almanac); + setUtcModel(env, utcModelObj, galileoAssistance.utcModel); + setTimeModels(env, timeModelsObj, galileoAssistance.timeModels); + setGlonassSatelliteEphemeris(env, satelliteEphemerisObj, galileoAssistance.satelliteEphemeris); + setSatelliteCorrections(env, satelliteCorrectionsObj, galileoAssistance.satelliteCorrections); + env->DeleteLocalRef(glonassAlmanacObj); + env->DeleteLocalRef(utcModelObj); + env->DeleteLocalRef(timeModelsObj); + env->DeleteLocalRef(satelliteEphemerisObj); + env->DeleteLocalRef(satelliteCorrectionsObj); +} + +void GnssAssistanceUtil::setGlonassAlmanac(JNIEnv* env, jobject glonassAlmanacObj, + GlonassAlmanac& glonassAlmanac) { + if (glonassAlmanacObj == nullptr) { + glonassAlmanac.issueDateMs = -1; + return; + } + jlong issueDateMillis = + env->CallLongMethod(glonassAlmanacObj, method_glonassAlmanacGetIssueDateMillis); + glonassAlmanac.issueDateMs = issueDateMillis; + jobject satelliteAlmanacsObj = + env->CallObjectMethod(glonassAlmanacObj, method_glonassAlmanacGetSatelliteAlmanacs); + if (satelliteAlmanacsObj == nullptr) return; + auto len = env->CallIntMethod(satelliteAlmanacsObj, method_listSize); + for (uint16_t i = 0; i < len; ++i) { + jobject glonassSatelliteAlmanacObj = + env->CallObjectMethod(satelliteAlmanacsObj, method_listGet, i); + if (glonassSatelliteAlmanacObj == nullptr) continue; + GlonassSatelliteAlmanac glonassSatelliteAlmanac; + jdouble deltaI = env->CallDoubleMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetDeltaI); + glonassSatelliteAlmanac.deltaI = deltaI; + jdouble deltaT = env->CallDoubleMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetDeltaT); + glonassSatelliteAlmanac.deltaT = deltaT; + jdouble deltaTDot = env->CallDoubleMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetDeltaTDot); + glonassSatelliteAlmanac.deltaTDot = deltaTDot; + jdouble eccentricity = env->CallDoubleMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetEccentricity); + glonassSatelliteAlmanac.eccentricity = eccentricity; + jint frequencyChannelNumber = + env->CallIntMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetFrequencyChannelNumber); + glonassSatelliteAlmanac.frequencyChannelNumber = + static_cast<int32_t>(frequencyChannelNumber); + jdouble lambda = env->CallDoubleMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetLambda); + glonassSatelliteAlmanac.lambda = lambda; + jdouble omega = env->CallDoubleMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetOmega); + glonassSatelliteAlmanac.omega = omega; + jint slotNumber = env->CallIntMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetSlotNumber); + glonassSatelliteAlmanac.slotNumber = static_cast<int32_t>(slotNumber); + jint healthState = env->CallIntMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetHealthState); + glonassSatelliteAlmanac.svHealth = static_cast<int32_t>(healthState); + jdouble tLambda = env->CallDoubleMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetTLambda); + glonassSatelliteAlmanac.tLambda = tLambda; + jdouble tau = env->CallDoubleMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetTau); + glonassSatelliteAlmanac.tau = tau; + jboolean isGlonassM = env->CallBooleanMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetIsGlonassM); + glonassSatelliteAlmanac.isGlonassM = isGlonassM; + jint calendarDayNumber = + env->CallIntMethod(glonassSatelliteAlmanacObj, + method_glonassSatelliteAlmanacGetCalendarDayNumber); + glonassSatelliteAlmanac.calendarDayNumber = static_cast<int32_t>(calendarDayNumber); + glonassAlmanac.satelliteAlmanacs.push_back(glonassSatelliteAlmanac); + env->DeleteLocalRef(glonassSatelliteAlmanacObj); + } + env->DeleteLocalRef(satelliteAlmanacsObj); +} + +void GnssAssistanceUtil::setGlonassSatelliteEphemeris( + JNIEnv* env, jobject glonassSatelliteEphemerisListObj, + std::vector<GlonassSatelliteEphemeris>& glonassSatelliteEphemerisList) { + if (glonassSatelliteEphemerisListObj == nullptr) return; + auto len = env->CallIntMethod(glonassSatelliteEphemerisListObj, method_listSize); + for (uint16_t i = 0; i < len; ++i) { + jobject glonassSatelliteEphemerisObj = + env->CallObjectMethod(glonassSatelliteEphemerisListObj, method_listGet, i); + if (glonassSatelliteEphemerisObj == nullptr) continue; + GlonassSatelliteEphemeris glonassSatelliteEphemeris; + jdouble ageInDays = env->CallDoubleMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetAgeInDays); + glonassSatelliteEphemeris.ageInDays = ageInDays; + + // Set the GlonassSatelliteClockModel. + jobject glonassSatelliteClockModelObj = + env->CallObjectMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetSatelliteClockModel); + GlonassSatelliteClockModel glonassSatelliteClockModel; + jdouble clockBias = env->CallDoubleMethod(glonassSatelliteClockModelObj, + method_glonassSatelliteClockModelGetClockBias); + glonassSatelliteClockModel.clockBias = clockBias; + jdouble frequencyBias = + env->CallDoubleMethod(glonassSatelliteClockModelObj, + method_glonassSatelliteClockModelGetFrequencyBias); + glonassSatelliteClockModel.frequencyBias = frequencyBias; + jint frequencyChannelNumber = + env->CallIntMethod(glonassSatelliteClockModelObj, + method_glonassSatelliteClockModelGetFrequencyChannelNumber); + glonassSatelliteClockModel.frequencyChannelNumber = + static_cast<int32_t>(frequencyChannelNumber); + jdouble timeOfClockSeconds = + env->CallDoubleMethod(glonassSatelliteClockModelObj, + method_glonassSatelliteClockModelGetTimeOfClockSeconds); + glonassSatelliteClockModel.timeOfClockSeconds = timeOfClockSeconds; + glonassSatelliteEphemeris.satelliteClockModel = glonassSatelliteClockModel; + env->DeleteLocalRef(glonassSatelliteClockModelObj); + + // Set the GlonassSatelliteOrbitModel. + jobject glonassSatelliteOrbitModelObj = + env->CallObjectMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetSatelliteOrbitModel); + GlonassSatelliteOrbitModel glonassSatelliteOrbitModel; + jdouble x = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetX); + glonassSatelliteOrbitModel.x = x; + jdouble y = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetY); + glonassSatelliteOrbitModel.y = y; + jdouble z = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetZ); + glonassSatelliteOrbitModel.z = z; + jdouble xAccel = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetXAccel); + glonassSatelliteOrbitModel.xAccel = xAccel; + jdouble yAccel = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetYAccel); + glonassSatelliteOrbitModel.yAccel = yAccel; + jdouble zAccel = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetZAccel); + glonassSatelliteOrbitModel.zAccel = zAccel; + jdouble xDot = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetXDot); + glonassSatelliteOrbitModel.xDot = xDot; + jdouble yDot = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetYDot); + glonassSatelliteOrbitModel.yDot = yDot; + jdouble zDot = env->CallDoubleMethod(glonassSatelliteOrbitModelObj, + method_glonassSatelliteOrbitModelGetZDot); + glonassSatelliteOrbitModel.zDot = zDot; + glonassSatelliteEphemeris.satelliteOrbitModel = glonassSatelliteOrbitModel; + env->DeleteLocalRef(glonassSatelliteOrbitModelObj); + + jint healthState = env->CallIntMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetHealthState); + glonassSatelliteEphemeris.svHealth = static_cast<int32_t>(healthState); + jint slotNumber = env->CallIntMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetSlotNumber); + glonassSatelliteEphemeris.slotNumber = static_cast<int32_t>(slotNumber); + jdouble frameTimeSeconds = + env->CallDoubleMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetFrameTimeSeconds); + glonassSatelliteEphemeris.frameTimeSeconds = frameTimeSeconds; + jint updateIntervalMinutes = + env->CallIntMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetUpdateIntervalMinutes); + glonassSatelliteEphemeris.updateIntervalMinutes = + static_cast<int32_t>(updateIntervalMinutes); + jboolean isGlonassM = env->CallBooleanMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetIsGlonassM); + glonassSatelliteEphemeris.isGlonassM = isGlonassM; + jboolean isUpdateIntervalOdd = + env->CallBooleanMethod(glonassSatelliteEphemerisObj, + method_glonassSatelliteEphemerisGetIsUpdateIntervalOdd); + glonassSatelliteEphemeris.isOddUpdateInterval = isUpdateIntervalOdd; + glonassSatelliteEphemerisList.push_back(glonassSatelliteEphemeris); + env->DeleteLocalRef(glonassSatelliteEphemerisObj); + } +} + +void GnssAssistanceUtil::setGalileoAssistance(JNIEnv* env, jobject galileoAssistanceObj, + GalileoAssistance& galileoAssistance) { + jobject galileoAlmanacObj = + env->CallObjectMethod(galileoAssistanceObj, method_galileoAssistanceGetAlmanac); + jobject ionosphericModelObj = + env->CallObjectMethod(galileoAssistanceObj, + method_galileoAssistanceGetIonosphericModel); + jobject utcModelObj = + env->CallObjectMethod(galileoAssistanceObj, method_galileoAssistanceGetUtcModel); + jobject leapSecondsModelObj = + env->CallObjectMethod(galileoAssistanceObj, + method_galileoAssistanceGetLeapSecondsModel); + jobject timeModelsObj = + env->CallObjectMethod(galileoAssistanceObj, method_galileoAssistanceGetTimeModels); + jobject satelliteEphemerisObj = + env->CallObjectMethod(galileoAssistanceObj, + method_galileoAssistanceGetSatelliteEphemeris); + jobject realTimeIntegrityModelsObj = + env->CallObjectMethod(galileoAssistanceObj, + method_galileoAssistanceGetRealTimeIntegrityModels); + jobject satelliteCorrectionsObj = + env->CallObjectMethod(galileoAssistanceObj, + method_galileoAssistanceGetSatelliteCorrections); + setGnssAlmanac(env, galileoAlmanacObj, galileoAssistance.almanac); + setGaliloKlobucharIonosphericModel(env, ionosphericModelObj, + galileoAssistance.ionosphericModel); + setUtcModel(env, utcModelObj, galileoAssistance.utcModel); + setLeapSecondsModel(env, leapSecondsModelObj, galileoAssistance.leapSecondsModel); + setTimeModels(env, timeModelsObj, galileoAssistance.timeModels); + setGalileoSatelliteEphemeris(env, satelliteEphemerisObj, galileoAssistance.satelliteEphemeris); + setRealTimeIntegrityModels(env, realTimeIntegrityModelsObj, + galileoAssistance.realTimeIntegrityModels); + setSatelliteCorrections(env, satelliteCorrectionsObj, galileoAssistance.satelliteCorrections); + env->DeleteLocalRef(galileoAlmanacObj); + env->DeleteLocalRef(ionosphericModelObj); + env->DeleteLocalRef(utcModelObj); + env->DeleteLocalRef(leapSecondsModelObj); + env->DeleteLocalRef(timeModelsObj); + env->DeleteLocalRef(satelliteEphemerisObj); + env->DeleteLocalRef(realTimeIntegrityModelsObj); + env->DeleteLocalRef(satelliteCorrectionsObj); +} + +void GnssAssistanceUtil::setGaliloKlobucharIonosphericModel( + JNIEnv* env, jobject galileoIonosphericModelObj, + GalileoIonosphericModel& ionosphericModel) { + if (galileoIonosphericModelObj == nullptr) return; + jdouble ai0 = + env->CallDoubleMethod(galileoIonosphericModelObj, method_galileoIonosphericModelGetAi0); + ionosphericModel.ai0 = ai0; + jdouble ai1 = + env->CallDoubleMethod(galileoIonosphericModelObj, method_galileoIonosphericModelGetAi1); + ionosphericModel.ai1 = ai1; + jdouble ai2 = + env->CallDoubleMethod(galileoIonosphericModelObj, method_galileoIonosphericModelGetAi2); + ionosphericModel.ai2 = ai2; +} + +void GnssAssistanceUtil::setGalileoSatelliteEphemeris( + JNIEnv* env, jobject galileoSatelliteEphemerisListObj, + std::vector<GalileoSatelliteEphemeris>& galileoSatelliteEphemerisList) { + if (galileoSatelliteEphemerisListObj == nullptr) return; + auto len = env->CallIntMethod(galileoSatelliteEphemerisListObj, method_listSize); + for (uint16_t i = 0; i < len; ++i) { + jobject galileoSatelliteEphemerisObj = + env->CallObjectMethod(galileoSatelliteEphemerisListObj, method_listGet, i); + GalileoSatelliteEphemeris galileoSatelliteEphemeris; + GalileoSvHealth galileoSvHealth; + // Set the svid of the satellite. + jint svid = env->CallLongMethod(galileoSatelliteEphemerisObj, + method_galileoSatelliteEphemerisGetSvid); + galileoSatelliteEphemeris.svid = svid; + + // Set the satellite clock models. + jobject galileoSatelliteClockModelListObj = + env->CallObjectMethod(galileoSatelliteEphemerisObj, + method_galileoSatelliteEphemerisGetSatelliteClockModels); + auto size = env->CallIntMethod(galileoSatelliteClockModelListObj, method_listSize); + for (uint16_t j = 0; j < size; ++j) { + jobject galileoSatelliteClockModelObj = + env->CallObjectMethod(galileoSatelliteClockModelListObj, method_listGet, j); + if (galileoSatelliteClockModelObj == nullptr) continue; + GalileoSatelliteClockModel galileoSatelliteClockModel; + jdouble af0 = env->CallDoubleMethod(galileoSatelliteClockModelObj, + method_galileoSatelliteClockModelGetAf0); + galileoSatelliteClockModel.af0 = af0; + jdouble af1 = env->CallDoubleMethod(galileoSatelliteClockModelObj, + method_galileoSatelliteClockModelGetAf1); + galileoSatelliteClockModel.af1 = af1; + jdouble af2 = env->CallDoubleMethod(galileoSatelliteClockModelObj, + method_galileoSatelliteClockModelGetAf2); + galileoSatelliteClockModel.af2 = af2; + jdouble bgdSeconds = + env->CallDoubleMethod(galileoSatelliteClockModelObj, + method_galileoSatelliteClockModelGetBgdSeconds); + galileoSatelliteClockModel.bgdSeconds = bgdSeconds; + jint satelliteClockType = + env->CallIntMethod(galileoSatelliteClockModelObj, + method_galileoSatelliteClockModelGetSatelliteClockType); + galileoSatelliteClockModel.satelliteClockType = + static_cast<GalileoSatelliteClockModel::SatelliteClockType>(satelliteClockType); + jdouble sisaMeters = + env->CallDoubleMethod(galileoSatelliteClockModelObj, + method_galileoSatelliteClockModelGetSisaMeters); + galileoSatelliteClockModel.sisaMeters = sisaMeters; + jdouble timeOfClockSeconds = + env->CallDoubleMethod(galileoSatelliteClockModelObj, + method_galileoSatelliteClockModelGetTimeOfClockSeconds); + galileoSatelliteClockModel.timeOfClockSeconds = timeOfClockSeconds; + galileoSatelliteEphemeris.satelliteClockModel.push_back(galileoSatelliteClockModel); + env->DeleteLocalRef(galileoSatelliteClockModelObj); + } + env->DeleteLocalRef(galileoSatelliteClockModelListObj); + + // Set the satelliteOrbitModel of the satellite. + jobject satelliteOrbitModelObj = + env->CallObjectMethod(galileoSatelliteEphemerisObj, + method_galileoSatelliteEphemerisGetSatelliteOrbitModel); + GnssAssistanceUtil::setKeplerianOrbitModel(env, satelliteOrbitModelObj, + galileoSatelliteEphemeris.satelliteOrbitModel); + env->DeleteLocalRef(satelliteOrbitModelObj); + + // Set the satellite health of the satellite clock model. + jobject galileoSvHealthObj = + env->CallObjectMethod(galileoSatelliteEphemerisObj, + method_galileoSatelliteEphemerisGetSatelliteHealth); + jint dataValidityStatusE1b = + env->CallIntMethod(galileoSvHealthObj, + method_galileoSvHealthGetDataValidityStatusE1b); + galileoSvHealth.dataValidityStatusE1b = + static_cast<GalileoSvHealth::GalileoHealthDataVaidityType>(dataValidityStatusE1b); + jint dataValidityStatusE5a = + env->CallIntMethod(galileoSvHealthObj, + method_galileoSvHealthGetDataValidityStatusE5a); + galileoSvHealth.dataValidityStatusE5a = + static_cast<GalileoSvHealth::GalileoHealthDataVaidityType>(dataValidityStatusE5a); + jint dataValidityStatusE5b = + env->CallIntMethod(galileoSvHealthObj, + method_galileoSvHealthGetDataValidityStatusE5b); + galileoSvHealth.dataValidityStatusE5b = + static_cast<GalileoSvHealth::GalileoHealthDataVaidityType>(dataValidityStatusE5b); + jint signalHealthStatusE1b = + env->CallIntMethod(galileoSvHealthObj, + method_galileoSvHealthGetSignalHealthStatusE1b); + galileoSvHealth.signalHealthStatusE1b = + static_cast<GalileoSvHealth::GalileoHealthStatusType>(signalHealthStatusE1b); + jint signalHealthStatusE5a = + env->CallIntMethod(galileoSvHealthObj, + method_galileoSvHealthGetSignalHealthStatusE5a); + galileoSvHealth.signalHealthStatusE5a = + static_cast<GalileoSvHealth::GalileoHealthStatusType>(signalHealthStatusE5a); + jint signalHealthStatusE5b = + env->CallIntMethod(galileoSvHealthObj, + method_galileoSvHealthGetSignalHealthStatusE5b); + galileoSvHealth.signalHealthStatusE5b = + static_cast<GalileoSvHealth::GalileoHealthStatusType>(signalHealthStatusE5b); + galileoSatelliteEphemeris.svHealth = galileoSvHealth; + env->DeleteLocalRef(galileoSvHealthObj); + + // Set the satelliteEphemerisTime of the satellite. + jobject satelliteEphemerisTimeObj = + env->CallObjectMethod(galileoSatelliteEphemerisObj, + method_galileoSatelliteEphemerisGetSatelliteEphemerisTime); + GnssAssistanceUtil::setSatelliteEphemerisTime(env, satelliteEphemerisTimeObj, + galileoSatelliteEphemeris + .satelliteEphemerisTime); + env->DeleteLocalRef(satelliteEphemerisTimeObj); + + galileoSatelliteEphemerisList.push_back(galileoSatelliteEphemeris); + env->DeleteLocalRef(galileoSatelliteEphemerisObj); + } +} + +void GnssAssistanceUtil::setBeidouAssistance(JNIEnv* env, jobject beidouAssistanceObj, + BeidouAssistance& beidouAssistance) { + jobject beidouAlmanacObj = + env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetAlmanac); + jobject ionosphericModelObj = + env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetIonosphericModel); + jobject utcModelObj = + env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetUtcModel); + jobject leapSecondsModelObj = + env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetLeapSecondsModel); + jobject timeModelsObj = + env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetTimeModels); + jobject satelliteEphemerisObj = + env->CallObjectMethod(beidouAssistanceObj, + method_beidouAssistanceGetSatelliteEphemeris); + jobject realTimeIntegrityModelsObj = + env->CallObjectMethod(beidouAssistanceObj, + method_beidouAssistanceGetRealTimeIntegrityModels); + jobject satelliteCorrectionsObj = + env->CallObjectMethod(beidouAssistanceObj, + method_beidouAssistanceGetSatelliteCorrections); + setGnssAlmanac(env, beidouAlmanacObj, beidouAssistance.almanac); + setKlobucharIonosphericModel(env, ionosphericModelObj, beidouAssistance.ionosphericModel); + setUtcModel(env, utcModelObj, beidouAssistance.utcModel); + setLeapSecondsModel(env, leapSecondsModelObj, beidouAssistance.leapSecondsModel); + setTimeModels(env, timeModelsObj, beidouAssistance.timeModels); + setBeidouSatelliteEphemeris(env, satelliteEphemerisObj, beidouAssistance.satelliteEphemeris); + setRealTimeIntegrityModels(env, realTimeIntegrityModelsObj, + beidouAssistance.realTimeIntegrityModels); + setSatelliteCorrections(env, satelliteCorrectionsObj, beidouAssistance.satelliteCorrections); + env->DeleteLocalRef(beidouAlmanacObj); + env->DeleteLocalRef(ionosphericModelObj); + env->DeleteLocalRef(utcModelObj); + env->DeleteLocalRef(leapSecondsModelObj); + env->DeleteLocalRef(timeModelsObj); + env->DeleteLocalRef(satelliteEphemerisObj); + env->DeleteLocalRef(realTimeIntegrityModelsObj); + env->DeleteLocalRef(satelliteCorrectionsObj); +} + +void GnssAssistanceUtil::setBeidouSatelliteEphemeris( + JNIEnv* env, jobject beidouSatelliteEphemerisListObj, + std::vector<BeidouSatelliteEphemeris>& beidouSatelliteEphemerisList) { + if (beidouSatelliteEphemerisListObj == nullptr) return; + auto len = env->CallIntMethod(beidouSatelliteEphemerisListObj, method_listSize); + for (uint16_t i = 0; i < len; ++i) { + jobject beidouSatelliteEphemerisObj = + env->CallObjectMethod(beidouSatelliteEphemerisListObj, method_listGet, i); + if (beidouSatelliteEphemerisObj == nullptr) continue; + BeidouSatelliteEphemeris beidouSatelliteEphemeris; + + // Set the svid of the satellite. + jint svid = env->CallIntMethod(beidouSatelliteEphemerisObj, + method_beidouSatelliteEphemerisGetSvid); + beidouSatelliteEphemeris.svid = static_cast<int32_t>(svid); + + // Set the satelliteClockModel of the satellite. + jobject satelliteClockModelObj = + env->CallObjectMethod(beidouSatelliteEphemerisObj, + method_beidouSatelliteEphemerisGetSatelliteClockModel); + jdouble af0 = env->CallDoubleMethod(satelliteClockModelObj, + method_beidouSatelliteClockModelGetAf0); + jdouble af1 = env->CallDoubleMethod(satelliteClockModelObj, + method_beidouSatelliteClockModelGetAf1); + jdouble af2 = env->CallDoubleMethod(satelliteClockModelObj, + method_beidouSatelliteClockModelGetAf2); + jdouble tgd1 = env->CallDoubleMethod(satelliteClockModelObj, + method_beidouSatelliteClockModelGetTgd1); + jdouble tgd2 = env->CallDoubleMethod(satelliteClockModelObj, + method_beidouSatelliteClockModelGetTgd2); + jdouble aodc = env->CallDoubleMethod(satelliteClockModelObj, + method_beidouSatelliteClockModelGetAodc); + jlong timeOfClockSeconds = + env->CallLongMethod(satelliteClockModelObj, + method_beidouSatelliteClockModelGetTimeOfClockSeconds); + beidouSatelliteEphemeris.satelliteClockModel.af0 = af0; + beidouSatelliteEphemeris.satelliteClockModel.af1 = af1; + beidouSatelliteEphemeris.satelliteClockModel.af2 = af2; + beidouSatelliteEphemeris.satelliteClockModel.tgd1 = tgd1; + beidouSatelliteEphemeris.satelliteClockModel.tgd2 = tgd2; + beidouSatelliteEphemeris.satelliteClockModel.aodc = aodc; + beidouSatelliteEphemeris.satelliteClockModel.timeOfClockSeconds = timeOfClockSeconds; + env->DeleteLocalRef(satelliteClockModelObj); + + // Set the satelliteOrbitModel of the satellite. + jobject satelliteOrbitModelObj = + env->CallObjectMethod(beidouSatelliteEphemerisObj, + method_beidouSatelliteEphemerisGetSatelliteOrbitModel); + GnssAssistanceUtil::setKeplerianOrbitModel(env, satelliteOrbitModelObj, + beidouSatelliteEphemeris.satelliteOrbitModel); + env->DeleteLocalRef(satelliteOrbitModelObj); + + // Set the satelliteHealth of the satellite. + jobject satelliteHealthObj = + env->CallObjectMethod(beidouSatelliteEphemerisObj, + method_beidouSatelliteEphemerisGetSatelliteHealth); + jint satH1 = env->CallIntMethod(satelliteHealthObj, method_beidouSatelliteHealthGetSatH1); + jint svAccur = + env->CallIntMethod(satelliteHealthObj, method_beidouSatelliteHealthGetSvAccur); + beidouSatelliteEphemeris.satelliteHealth.satH1 = static_cast<int32_t>(satH1); + beidouSatelliteEphemeris.satelliteHealth.svAccur = static_cast<int32_t>(svAccur); + env->DeleteLocalRef(satelliteHealthObj); + + // Set the satelliteEphemerisTime of the satellite. + jobject satelliteEphemerisTimeObj = + env->CallObjectMethod(beidouSatelliteEphemerisObj, + method_beidouSatelliteEphemerisGetSatelliteEphemerisTime); + jint iode = env->CallIntMethod(satelliteEphemerisTimeObj, + method_beidouSatelliteEphemerisTimeGetIode); + jint beidouWeekNumber = + env->CallIntMethod(satelliteEphemerisTimeObj, + method_beidouSatelliteEphemerisTimeGetBeidouWeekNumber); + jint toeSeconds = env->CallDoubleMethod(satelliteEphemerisTimeObj, + method_beidouSatelliteEphemerisTimeGetToeSeconds); + beidouSatelliteEphemeris.satelliteEphemerisTime.aode = static_cast<int32_t>(iode); + beidouSatelliteEphemeris.satelliteEphemerisTime.weekNumber = + static_cast<int32_t>(beidouWeekNumber); + beidouSatelliteEphemeris.satelliteEphemerisTime.toeSeconds = + static_cast<int32_t>(toeSeconds); + env->DeleteLocalRef(satelliteEphemerisTimeObj); + + beidouSatelliteEphemerisList.push_back(beidouSatelliteEphemeris); + env->DeleteLocalRef(beidouSatelliteEphemerisObj); + } +} + +void GnssAssistanceUtil::setGpsAssistance(JNIEnv* env, jobject gpsAssistanceObj, + GpsAssistance& gpsAssistance) { + jobject gnssAlmanacObj = + env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetAlmanac); + jobject ionosphericModelObj = + env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetIonosphericModel); + jobject utcModelObj = env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetUtcModel); + jobject leapSecondsModelObj = + env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetLeapSecondsModel); + jobject timeModelsObj = + env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetTimeModels); + jobject satelliteEphemerisObj = + env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetSatelliteEphemeris); + jobject realTimeIntegrityModelsObj = + env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetRealTimeIntegrityModels); + jobject satelliteCorrectionsObj = + env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetSatelliteCorrections); + + setGnssAlmanac(env, gnssAlmanacObj, gpsAssistance.almanac); + setKlobucharIonosphericModel(env, ionosphericModelObj, gpsAssistance.ionosphericModel); + setUtcModel(env, utcModelObj, gpsAssistance.utcModel); + setLeapSecondsModel(env, leapSecondsModelObj, gpsAssistance.leapSecondsModel); + setTimeModels(env, timeModelsObj, gpsAssistance.timeModels); + setGpsOrQzssSatelliteEphemeris<GpsSatelliteEphemeris>(env, satelliteEphemerisObj, + gpsAssistance.satelliteEphemeris); + setRealTimeIntegrityModels(env, realTimeIntegrityModelsObj, + gpsAssistance.realTimeIntegrityModels); + setSatelliteCorrections(env, satelliteCorrectionsObj, gpsAssistance.satelliteCorrections); + env->DeleteLocalRef(gnssAlmanacObj); + env->DeleteLocalRef(ionosphericModelObj); + env->DeleteLocalRef(utcModelObj); + env->DeleteLocalRef(leapSecondsModelObj); + env->DeleteLocalRef(timeModelsObj); + env->DeleteLocalRef(satelliteEphemerisObj); + env->DeleteLocalRef(realTimeIntegrityModelsObj); + env->DeleteLocalRef(satelliteCorrectionsObj); +} + +/** Set the GPS/QZSS satellite ephemeris list. */ +template <class T> +void GnssAssistanceUtil::setGpsOrQzssSatelliteEphemeris(JNIEnv* env, + jobject satelliteEphemerisListObj, + std::vector<T>& satelliteEphemerisList) { + if (satelliteEphemerisListObj == nullptr) return; + auto len = env->CallIntMethod(satelliteEphemerisListObj, method_listSize); + for (uint16_t i = 0; i < len; ++i) { + jobject satelliteEphemerisObj = + env->CallObjectMethod(satelliteEphemerisListObj, method_listGet, i); + if (satelliteEphemerisObj == nullptr) continue; + T satelliteEphemeris; + // Set the svid of the satellite. + jint svid = env->CallIntMethod(satelliteEphemerisObj, method_gpsSatelliteEphemerisGetSvid); + satelliteEphemeris.svid = static_cast<int32_t>(svid); + + // Set the gpsL2Params of the satellite. + jobject gpsL2ParamsObj = env->CallObjectMethod(satelliteEphemerisObj, + method_gpsSatelliteEphemerisGetGpsL2Params); + jint l2Code = env->CallIntMethod(gpsL2ParamsObj, method_gpsL2ParamsGetL2Code); + jint l2Flag = env->CallIntMethod(gpsL2ParamsObj, method_gpsL2ParamsGetL2Flag); + satelliteEphemeris.gpsL2Params.l2Code = static_cast<int32_t>(l2Code); + satelliteEphemeris.gpsL2Params.l2Flag = static_cast<int32_t>(l2Flag); + env->DeleteLocalRef(gpsL2ParamsObj); + + // Set the satelliteClockModel of the satellite. + jobject satelliteClockModelObj = + env->CallObjectMethod(satelliteEphemerisObj, + method_gpsSatelliteEphemerisGetSatelliteClockModel); + jdouble af0 = + env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetAf0); + jdouble af1 = + env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetAf1); + jdouble af2 = + env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetAf2); + jdouble tgd = + env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetTgd); + jint iodc = + env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetIodc); + jlong timeOfClockSeconds = + env->CallLongMethod(satelliteClockModelObj, + method_gpsSatelliteClockModelGetTimeOfClockSeconds); + satelliteEphemeris.satelliteClockModel.af0 = af0; + satelliteEphemeris.satelliteClockModel.af1 = af1; + satelliteEphemeris.satelliteClockModel.af2 = af2; + satelliteEphemeris.satelliteClockModel.tgd = tgd; + satelliteEphemeris.satelliteClockModel.iodc = static_cast<int32_t>(iodc); + satelliteEphemeris.satelliteClockModel.timeOfClockSeconds = timeOfClockSeconds; + env->DeleteLocalRef(satelliteClockModelObj); + + // Set the satelliteOrbitModel of the satellite. + jobject satelliteOrbitModelObj = + env->CallObjectMethod(satelliteEphemerisObj, + method_gpsSatelliteEphemerisGetSatelliteOrbitModel); + GnssAssistanceUtil::setKeplerianOrbitModel(env, satelliteOrbitModelObj, + satelliteEphemeris.satelliteOrbitModel); + env->DeleteLocalRef(satelliteOrbitModelObj); + + // Set the satelliteHealth of the satellite. + jobject satelliteHealthObj = + env->CallObjectMethod(satelliteEphemerisObj, + method_gpsSatelliteEphemerisGetSatelliteHealth); + jint svHealth = + env->CallIntMethod(satelliteHealthObj, method_gpsSatelliteHealthGetSvHealth); + jdouble svAccur = + env->CallDoubleMethod(satelliteHealthObj, method_gpsSatelliteHealthGetSvAccur); + jdouble fitInt = env->CallIntMethod(satelliteHealthObj, method_gpsSatelliteHealthGetFitInt); + satelliteEphemeris.satelliteHealth.svHealth = static_cast<int32_t>(svHealth); + satelliteEphemeris.satelliteHealth.svAccur = svAccur; + satelliteEphemeris.satelliteHealth.fitInt = fitInt; + env->DeleteLocalRef(satelliteHealthObj); + + // Set the satelliteEphemerisTime of the satellite. + jobject satelliteEphemerisTimeObj = + env->CallObjectMethod(satelliteEphemerisObj, + method_gpsSatelliteEphemerisGetSatelliteEphemerisTime); + GnssAssistanceUtil::setSatelliteEphemerisTime(env, satelliteEphemerisTimeObj, + satelliteEphemeris.satelliteEphemerisTime); + env->DeleteLocalRef(satelliteEphemerisTimeObj); + + satelliteEphemerisList.push_back(satelliteEphemeris); + env->DeleteLocalRef(satelliteEphemerisObj); + } +} + +void GnssAssistanceUtil::setSatelliteCorrections( + JNIEnv* env, jobject satelliteCorrectionsObj, + std::vector<GnssSatelliteCorrections>& gnssSatelliteCorrectionsList) { + if (satelliteCorrectionsObj == nullptr) return; + auto len = env->CallIntMethod(satelliteCorrectionsObj, method_listSize); + for (uint16_t i = 0; i < len; ++i) { + GnssSatelliteCorrections gnssSatelliteCorrections; + jobject satelliteCorrectionObj = + env->CallObjectMethod(satelliteCorrectionsObj, method_listGet, i); + if (satelliteCorrectionObj == nullptr) continue; + jint svid = env->CallIntMethod(satelliteCorrectionObj, method_satelliteCorrectionGetSvid); + gnssSatelliteCorrections.svid = svid; + jobject ionosphericCorrectionsObj = + env->CallObjectMethod(satelliteCorrectionObj, + method_satelliteCorrectionGetIonosphericCorrections); + env->DeleteLocalRef(satelliteCorrectionObj); + auto size = env->CallIntMethod(ionosphericCorrectionsObj, method_listSize); + for (uint16_t j = 0; j < size; ++j) { + jobject ionosphericCorrectionObj = + env->CallObjectMethod(ionosphericCorrectionsObj, method_listGet, j); + if (ionosphericCorrectionObj == nullptr) continue; + IonosphericCorrection ionosphericCorrection; + jlong carrierFrequencyHz = + env->CallLongMethod(ionosphericCorrectionObj, + method_ionosphericCorrectionGetCarrierFrequencyHz); + ionosphericCorrection.carrierFrequencyHz = carrierFrequencyHz; + + jobject gnssCorrectionComponentObj = + env->CallObjectMethod(ionosphericCorrectionObj, + method_ionosphericCorrectionGetIonosphericCorrection); + env->DeleteLocalRef(ionosphericCorrectionObj); + + jstring sourceKey = static_cast<jstring>( + env->CallObjectMethod(gnssCorrectionComponentObj, + method_gnssCorrectionComponentGetSourceKey)); + ScopedJniString jniSourceKey{env, sourceKey}; + ionosphericCorrection.ionosphericCorrectionComponent.sourceKey = + android::String16(jniSourceKey.c_str()); + + jobject pseudorangeCorrectionObj = + env->CallObjectMethod(gnssCorrectionComponentObj, + method_gnssCorrectionComponentGetPseudorangeCorrection); + jdouble correctionMeters = + env->CallDoubleMethod(pseudorangeCorrectionObj, + method_pseudorangeCorrectionGetCorrectionMeters); + jdouble correctionUncertaintyMeters = env->CallDoubleMethod( + pseudorangeCorrectionObj, + method_pseudorangeCorrectionGetCorrectionUncertaintyMeters); + jdouble correctionRateMetersPerSecond = env->CallDoubleMethod( + pseudorangeCorrectionObj, + method_pseudorangeCorrectionGetCorrectionRateMetersPerSecond); + ionosphericCorrection.ionosphericCorrectionComponent.pseudorangeCorrection + .correctionMeters = correctionMeters; + ionosphericCorrection.ionosphericCorrectionComponent.pseudorangeCorrection + .correctionUncertaintyMeters = correctionUncertaintyMeters; + ionosphericCorrection.ionosphericCorrectionComponent.pseudorangeCorrection + .correctionRateMetersPerSecond = correctionRateMetersPerSecond; + env->DeleteLocalRef(pseudorangeCorrectionObj); + + jobject gnssIntervalObj = + env->CallObjectMethod(gnssCorrectionComponentObj, + method_gnssCorrectionComponentGetValidityInterval); + jdouble startMillisSinceGpsEpoch = + env->CallDoubleMethod(gnssIntervalObj, + method_gnssIntervalGetStartMillisSinceGpsEpoch); + jdouble endMillisSinceGpsEpoch = + env->CallDoubleMethod(gnssIntervalObj, + method_gnssIntervalGetEndMillisSinceGpsEpoch); + ionosphericCorrection.ionosphericCorrectionComponent.validityInterval + .startMillisSinceGpsEpoch = startMillisSinceGpsEpoch; + ionosphericCorrection.ionosphericCorrectionComponent.validityInterval + .endMillisSinceGpsEpoch = endMillisSinceGpsEpoch; + env->DeleteLocalRef(gnssIntervalObj); + + env->DeleteLocalRef(gnssCorrectionComponentObj); + gnssSatelliteCorrections.ionosphericCorrections.push_back(ionosphericCorrection); + } + gnssSatelliteCorrectionsList.push_back(gnssSatelliteCorrections); + env->DeleteLocalRef(ionosphericCorrectionsObj); + } +} + +void GnssAssistanceUtil::setRealTimeIntegrityModels( + JNIEnv* env, jobject realTimeIntegrityModelsObj, + std::vector<RealTimeIntegrityModel>& realTimeIntegrityModels) { + if (realTimeIntegrityModelsObj == nullptr) return; + auto len = env->CallIntMethod(realTimeIntegrityModelsObj, method_listSize); + for (uint16_t i = 0; i < len; ++i) { + jobject realTimeIntegrityModelObj = + env->CallObjectMethod(realTimeIntegrityModelsObj, method_listGet, i); + if (realTimeIntegrityModelObj == nullptr) continue; + RealTimeIntegrityModel realTimeIntegrityModel; + jint badSvid = env->CallIntMethod(realTimeIntegrityModelObj, + method_realTimeIntegrityModelGetBadSvid); + jobject badSignalTypesObj = + env->CallObjectMethod(realTimeIntegrityModelObj, + method_realTimeIntegrityModelGetBadSignalTypes); + auto badSignalTypesSize = env->CallIntMethod(badSignalTypesObj, method_listSize); + for (uint16_t j = 0; j < badSignalTypesSize; ++j) { + GnssSignalType badSignalType; + jobject badSignalTypeObj = env->CallObjectMethod(badSignalTypesObj, method_listGet, j); + if (badSignalTypeObj != nullptr) { + setGnssSignalType(env, badSignalTypeObj, badSignalType); + realTimeIntegrityModel.badSignalTypes.push_back(badSignalType); + env->DeleteLocalRef(badSignalTypeObj); + } + } + + jlong startDateSeconds = + env->CallLongMethod(realTimeIntegrityModelObj, + method_realTimeIntegrityModelGetStartDateSeconds); + jlong endDateSeconds = env->CallLongMethod(realTimeIntegrityModelObj, + method_realTimeIntegrityModelGetEndDateSeconds); + jlong publishDateSeconds = + env->CallLongMethod(realTimeIntegrityModelObj, + method_realTimeIntegrityModelGetPublishDateSeconds); + jstring advisoryNumber = static_cast<jstring>( + env->CallObjectMethod(realTimeIntegrityModelObj, + method_realTimeIntegrityModelGetAdvisoryNumber)); + ScopedJniString jniAdvisoryNumber{env, advisoryNumber}; + jstring advisoryType = static_cast<jstring>( + env->CallObjectMethod(realTimeIntegrityModelObj, + method_realTimeIntegrityModelGetAdvisoryType)); + ScopedJniString jniAdvisoryType{env, advisoryType}; + + realTimeIntegrityModel.badSvid = badSvid; + realTimeIntegrityModel.startDateSeconds = startDateSeconds; + realTimeIntegrityModel.endDateSeconds = endDateSeconds; + realTimeIntegrityModel.publishDateSeconds = publishDateSeconds; + realTimeIntegrityModel.advisoryNumber = android::String16(jniAdvisoryNumber.c_str()); + realTimeIntegrityModel.advisoryType = android::String16(jniAdvisoryType.c_str()); + realTimeIntegrityModels.push_back(realTimeIntegrityModel); + env->DeleteLocalRef(badSignalTypesObj); + env->DeleteLocalRef(realTimeIntegrityModelObj); + } +} + +void GnssAssistanceUtil::setGnssSignalType(JNIEnv* env, jobject gnssSignalTypeObj, + GnssSignalType& gnssSignalType) { + if (gnssSignalTypeObj == nullptr) { + ALOGE("gnssSignalTypeObj is null"); + return; + } + jint constellationType = + env->CallIntMethod(gnssSignalTypeObj, method_gnssSignalTypeGetConstellationType); + jdouble carrierFrequencyHz = + env->CallIntMethod(gnssSignalTypeObj, method_gnssSignalTypeGetCarrierFrequencyHz); + jstring codeType = static_cast<jstring>( + env->CallObjectMethod(gnssSignalTypeObj, method_gnssSignalTypeGetCodeType)); + ScopedJniString jniCodeType{env, codeType}; + + gnssSignalType.constellation = static_cast<GnssConstellationType>(constellationType); + gnssSignalType.carrierFrequencyHz = static_cast<int32_t>(carrierFrequencyHz); + gnssSignalType.codeType = std::string(jniCodeType.c_str()); +} + +void GnssAssistanceUtil::setTimeModels(JNIEnv* env, jobject timeModelsObj, + std::vector<TimeModel>& timeModels) { + if (timeModelsObj == nullptr) return; + auto len = env->CallIntMethod(timeModelsObj, method_listSize); + for (uint16_t i = 0; i < len; ++i) { + jobject timeModelObj = env->CallObjectMethod(timeModelsObj, method_listGet, i); + TimeModel timeModel; + jint toGnss = env->CallIntMethod(timeModelObj, method_timeModelsGetToGnss); + jlong timeOfWeek = env->CallLongMethod(timeModelObj, method_timeModelsGetTimeOfWeek); + jint weekNumber = env->CallIntMethod(timeModelObj, method_timeModelsGetWeekNumber); + jdouble a0 = env->CallDoubleMethod(timeModelObj, method_timeModelsGetA0); + jdouble a1 = env->CallDoubleMethod(timeModelObj, method_timeModelsGetA1); + timeModel.toGnss = static_cast<GnssConstellationType>(toGnss); + timeModel.timeOfWeek = timeOfWeek; + timeModel.weekNumber = static_cast<int32_t>(weekNumber); + timeModel.a0 = a0; + timeModel.a1 = a1; + timeModels.push_back(timeModel); + env->DeleteLocalRef(timeModelObj); + } +} + +void GnssAssistanceUtil::setLeapSecondsModel(JNIEnv* env, jobject leapSecondsModelObj, + LeapSecondsModel& leapSecondsModel) { + if (leapSecondsModelObj == nullptr) { + leapSecondsModel.leapSeconds = -1; + return; + } + jint dayNumberLeapSecondsFuture = + env->CallIntMethod(leapSecondsModelObj, + method_leapSecondsModelGetDayNumberLeapSecondsFuture); + jint leapSeconds = + env->CallIntMethod(leapSecondsModelObj, method_leapSecondsModelGetLeapSeconds); + jint leapSecondsFuture = + env->CallIntMethod(leapSecondsModelObj, method_leapSecondsModelGetLeapSecondsFuture); + jint weekNumberLeapSecondsFuture = + env->CallIntMethod(leapSecondsModelObj, + method_leapSecondsModelGetWeekNumberLeapSecondsFuture); + leapSecondsModel.dayNumberLeapSecondsFuture = static_cast<int32_t>(dayNumberLeapSecondsFuture); + leapSecondsModel.leapSeconds = static_cast<int32_t>(leapSeconds); + leapSecondsModel.leapSecondsFuture = static_cast<int32_t>(leapSecondsFuture); + leapSecondsModel.weekNumberLeapSecondsFuture = + static_cast<int32_t>(weekNumberLeapSecondsFuture); +} + +void GnssAssistanceUtil::setSatelliteEphemerisTime(JNIEnv* env, jobject satelliteEphemerisTimeObj, + SatelliteEphemerisTime& satelliteEphemerisTime) { + if (satelliteEphemerisTimeObj == nullptr) return; + jdouble iode = + env->CallDoubleMethod(satelliteEphemerisTimeObj, method_satelliteEphemerisTimeGetIode); + jdouble toeSeconds = env->CallDoubleMethod(satelliteEphemerisTimeObj, + method_satelliteEphemerisTimeGetToeSeconds); + jint weekNumber = env->CallIntMethod(satelliteEphemerisTimeObj, + method_satelliteEphemerisTimeGetWeekNumber); + satelliteEphemerisTime.iode = iode; + satelliteEphemerisTime.toeSeconds = toeSeconds; + satelliteEphemerisTime.weekNumber = weekNumber; +} + +void GnssAssistanceUtil::setKeplerianOrbitModel(JNIEnv* env, jobject keplerianOrbitModelObj, + KeplerianOrbitModel& keplerianOrbitModel) { + if (keplerianOrbitModelObj == nullptr) return; + jdouble rootA = + env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetRootA); + jdouble eccentricity = env->CallDoubleMethod(keplerianOrbitModelObj, + method_keplerianOrbitModelGetEccentricity); + jdouble m0 = env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetM0); + jdouble omega = + env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetOmega); + jdouble omegaDot = + env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetOmegaDot); + jdouble deltaN = + env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetDeltaN); + jdouble iDot = env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetIDot); + jobject secondOrderHarmonicPerturbationObj = + env->CallObjectMethod(keplerianOrbitModelObj, + method_keplerianOrbitModelGetSecondOrderHarmonicPerturbation); + jdouble cic = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj, + method_secondOrderHarmonicPerturbationGetCic); + jdouble cis = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj, + method_secondOrderHarmonicPerturbationGetCis); + jdouble crs = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj, + method_secondOrderHarmonicPerturbationGetCrs); + jdouble crc = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj, + method_secondOrderHarmonicPerturbationGetCrc); + jdouble cuc = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj, + method_secondOrderHarmonicPerturbationGetCuc); + jdouble cus = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj, + method_secondOrderHarmonicPerturbationGetCus); + keplerianOrbitModel.rootA = rootA; + keplerianOrbitModel.eccentricity = eccentricity; + keplerianOrbitModel.m0 = m0; + keplerianOrbitModel.omega = omega; + keplerianOrbitModel.omegaDot = omegaDot; + keplerianOrbitModel.deltaN = deltaN; + keplerianOrbitModel.iDot = iDot; + keplerianOrbitModel.secondOrderHarmonicPerturbation.cic = cic; + keplerianOrbitModel.secondOrderHarmonicPerturbation.cis = cis; + keplerianOrbitModel.secondOrderHarmonicPerturbation.crs = crs; + keplerianOrbitModel.secondOrderHarmonicPerturbation.crc = crc; + keplerianOrbitModel.secondOrderHarmonicPerturbation.cuc = cuc; + keplerianOrbitModel.secondOrderHarmonicPerturbation.cus = cus; + env->DeleteLocalRef(secondOrderHarmonicPerturbationObj); +} + +void GnssAssistanceUtil::setKlobucharIonosphericModel( + JNIEnv* env, jobject klobucharIonosphericModelObj, + KlobucharIonosphericModel& klobucharIonosphericModel) { + if (klobucharIonosphericModelObj == nullptr) return; + jdouble alpha0 = env->CallDoubleMethod(klobucharIonosphericModelObj, + method_klobucharIonosphericModelGetAlpha0); + jdouble alpha1 = env->CallDoubleMethod(klobucharIonosphericModelObj, + method_klobucharIonosphericModelGetAlpha1); + jdouble alpha2 = env->CallDoubleMethod(klobucharIonosphericModelObj, + method_klobucharIonosphericModelGetAlpha2); + jdouble alpha3 = env->CallDoubleMethod(klobucharIonosphericModelObj, + method_klobucharIonosphericModelGetAlpha3); + jdouble beta0 = env->CallDoubleMethod(klobucharIonosphericModelObj, + method_klobucharIonosphericModelGetBeta0); + jdouble beta1 = env->CallDoubleMethod(klobucharIonosphericModelObj, + method_klobucharIonosphericModelGetBeta1); + jdouble beta2 = env->CallDoubleMethod(klobucharIonosphericModelObj, + method_klobucharIonosphericModelGetBeta2); + jdouble beta3 = env->CallDoubleMethod(klobucharIonosphericModelObj, + method_klobucharIonosphericModelGetBeta3); + klobucharIonosphericModel.alpha0 = alpha0; + klobucharIonosphericModel.alpha1 = alpha1; + klobucharIonosphericModel.alpha2 = alpha2; + klobucharIonosphericModel.alpha3 = alpha3; + klobucharIonosphericModel.beta0 = beta0; + klobucharIonosphericModel.beta1 = beta1; + klobucharIonosphericModel.beta2 = beta2; + klobucharIonosphericModel.beta3 = beta3; +} + +void GnssAssistanceUtil::setUtcModel(JNIEnv* env, jobject utcModelObj, UtcModel& utcModel) { + if (utcModelObj == nullptr) { + utcModel.weekNumber = -1; + return; + } + jdouble a0 = env->CallDoubleMethod(utcModelObj, method_utcModelGetA0); + jdouble a1 = env->CallDoubleMethod(utcModelObj, method_utcModelGetA1); + jlong timeOfWeek = env->CallLongMethod(utcModelObj, method_utcModelGetTimeOfWeek); + jint weekNumber = env->CallIntMethod(utcModelObj, method_utcModelGetWeekNumber); + utcModel.a0 = a0; + utcModel.a1 = a1; + utcModel.timeOfWeek = timeOfWeek; + utcModel.weekNumber = static_cast<int32_t>(weekNumber); +} + +void GnssAssistanceUtil::setGnssAlmanac(JNIEnv* env, jobject gnssAlmanacObj, + GnssAlmanac& gnssAlmanac) { + if (gnssAlmanacObj == nullptr) { + gnssAlmanac.weekNumber = -1; + return; + } + jlong issueDateMillis = + env->CallLongMethod(gnssAlmanacObj, method_gnssAlmanacGetIssueDateMillis); + jint ioda = env->CallIntMethod(gnssAlmanacObj, method_gnssAlmanacGetIoda); + jint weekNumber = env->CallIntMethod(gnssAlmanacObj, method_gnssAlmanacGetWeekNumber); + jlong toaSeconds = env->CallLongMethod(gnssAlmanacObj, method_gnssAlmanacGetToaSeconds); + jboolean isCompleteAlmanacProvided = + env->CallBooleanMethod(gnssAlmanacObj, method_gnssAlmanacIsCompleteAlmanacProvided); + gnssAlmanac.issueDateMs = issueDateMillis; + gnssAlmanac.ioda = ioda; + gnssAlmanac.weekNumber = weekNumber; + gnssAlmanac.toaSeconds = toaSeconds; + gnssAlmanac.isCompleteAlmanacProvided = isCompleteAlmanacProvided; + + jobject satelliteAlmanacsListObj = + env->CallObjectMethod(gnssAlmanacObj, method_gnssAlmanacGetSatelliteAlmanacs); + auto len = env->CallIntMethod(satelliteAlmanacsListObj, method_listSize); + std::vector<GnssSatelliteAlmanac> list(len); + for (uint16_t i = 0; i < len; ++i) { + jobject gnssSatelliteAlmanacObj = + env->CallObjectMethod(satelliteAlmanacsListObj, method_listGet, i); + if (gnssSatelliteAlmanacObj == nullptr) continue; + GnssSatelliteAlmanac gnssSatelliteAlmanac; + jint svid = env->CallIntMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetSvid); + jint svHealth = + env->CallIntMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetSvHealth); + jdouble af0 = env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetAf0); + jdouble af1 = env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetAf1); + jdouble eccentricity = env->CallDoubleMethod(gnssSatelliteAlmanacObj, + method_satelliteAlmanacGetEccentricity); + jdouble inclination = env->CallDoubleMethod(gnssSatelliteAlmanacObj, + method_satelliteAlmanacGetInclination); + jdouble m0 = env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetM0); + jdouble omega = + env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetOmega); + jdouble omega0 = + env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetOmega0); + jdouble omegaDot = + env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetOmegaDot); + jdouble rootA = + env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetRootA); + gnssSatelliteAlmanac.svid = static_cast<int32_t>(svid); + gnssSatelliteAlmanac.svHealth = static_cast<int32_t>(svHealth); + gnssSatelliteAlmanac.af0 = af0; + gnssSatelliteAlmanac.af1 = af1; + gnssSatelliteAlmanac.eccentricity = eccentricity; + gnssSatelliteAlmanac.inclination = inclination; + gnssSatelliteAlmanac.m0 = m0; + gnssSatelliteAlmanac.omega = omega; + gnssSatelliteAlmanac.omega0 = omega0; + gnssSatelliteAlmanac.omegaDot = omegaDot; + gnssSatelliteAlmanac.rootA = rootA; + list.at(i) = gnssSatelliteAlmanac; + env->DeleteLocalRef(gnssSatelliteAlmanacObj); + } + gnssAlmanac.satelliteAlmanacs = list; + env->DeleteLocalRef(satelliteAlmanacsListObj); +} + +void GnssAssistanceUtil::setAuxiliaryInformation(JNIEnv* env, jobject auxiliaryInformationObj, + AuxiliaryInformation& auxiliaryInformation) { + if (auxiliaryInformationObj == nullptr) { + auxiliaryInformation.svid = -1; + return; + } + jint svid = env->CallIntMethod(auxiliaryInformationObj, method_auxiliaryInformationGetSvid); + jobject availableSignalTypesObj = + env->CallObjectMethod(auxiliaryInformationObj, + method_auxiliaryInformationGetAvailableSignalTypes); + auto size = env->CallIntMethod(availableSignalTypesObj, method_listSize); + std::vector<GnssSignalType> availableSignalTypes(size); + for (uint16_t i = 0; i < size; ++i) { + jobject availableSignalTypeObj = + env->CallObjectMethod(availableSignalTypesObj, method_listGet, i); + GnssSignalType availableSignalType; + setGnssSignalType(env, availableSignalTypeObj, availableSignalType); + availableSignalTypes.at(i) = availableSignalType; + env->DeleteLocalRef(availableSignalTypeObj); + } + jint frequencyChannelNumber = + env->CallIntMethod(auxiliaryInformationObj, + method_auxiliaryInformationGetFrequencyChannelNumber); + jint satType = + env->CallIntMethod(auxiliaryInformationObj, method_auxiliaryInformationGetSatType); + auxiliaryInformation.svid = static_cast<int32_t>(svid); + auxiliaryInformation.availableSignalTypes = availableSignalTypes; + auxiliaryInformation.frequencyChannelNumber = static_cast<int32_t>(frequencyChannelNumber); + auxiliaryInformation.satType = static_cast<BeidouB1CSatelliteOrbitType>(satType); + env->DeleteLocalRef(availableSignalTypesObj); +} + +} // namespace android::gnss diff --git a/services/core/jni/gnss/GnssAssistance.h b/services/core/jni/gnss/GnssAssistance.h new file mode 100644 index 000000000000..ee97e19371f8 --- /dev/null +++ b/services/core/jni/gnss/GnssAssistance.h @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ANDROID_SERVER_GNSSASSITANCE_H +#define _ANDROID_SERVER_GNSSASSITANCE_H + +#include <sys/stat.h> +#pragma once + +#ifndef LOG_TAG +#error LOG_TAG must be defined before including this file. +#endif + +#include <android/hardware/gnss/gnss_assistance/BnGnssAssistanceInterface.h> +#include <log/log.h> + +#include "GnssAssistanceCallback.h" +#include "jni.h" + +namespace android::gnss { + +using IGnssAssistanceInterface = android::hardware::gnss::gnss_assistance::IGnssAssistanceInterface; +using IGnssAssistanceCallback = android::hardware::gnss::gnss_assistance::IGnssAssistanceCallback; +using BeidouAssistance = android::hardware::gnss::gnss_assistance::GnssAssistance::BeidouAssistance; +using BeidouSatelliteEphemeris = android::hardware::gnss::gnss_assistance::BeidouSatelliteEphemeris; +using GalileoAssistance = + android::hardware::gnss::gnss_assistance::GnssAssistance::GalileoAssistance; +using GalileoSatelliteEphemeris = + android::hardware::gnss::gnss_assistance::GalileoSatelliteEphemeris; +using GalileoIonosphericModel = android::hardware::gnss::gnss_assistance::GalileoIonosphericModel; +using GlonassAssistance = + android::hardware::gnss::gnss_assistance::GnssAssistance::GlonassAssistance; +using GlonassAlmanac = android::hardware::gnss::gnss_assistance::GlonassAlmanac; +using GlonassSatelliteEphemeris = + android::hardware::gnss::gnss_assistance::GlonassSatelliteEphemeris; +using GnssAssistance = android::hardware::gnss::gnss_assistance::GnssAssistance; +using GnssSignalType = android::hardware::gnss::GnssSignalType; +using GpsAssistance = android::hardware::gnss::gnss_assistance::GnssAssistance::GpsAssistance; +using QzssAssistance = android::hardware::gnss::gnss_assistance::GnssAssistance::QzssAssistance; +using GnssAlmanac = android::hardware::gnss::gnss_assistance::GnssAlmanac; +using GnssSatelliteCorrections = + android::hardware::gnss::gnss_assistance::GnssAssistance::GnssSatelliteCorrections; +using GpsSatelliteEphemeris = android::hardware::gnss::gnss_assistance::GpsSatelliteEphemeris; +using SatelliteEphemerisTime = android::hardware::gnss::gnss_assistance::SatelliteEphemerisTime; +using UtcModel = android::hardware::gnss::gnss_assistance::UtcModel; +using LeapSecondsModel = android::hardware::gnss::gnss_assistance::LeapSecondsModel; +using KeplerianOrbitModel = android::hardware::gnss::gnss_assistance::KeplerianOrbitModel; +using KlobucharIonosphericModel = + android::hardware::gnss::gnss_assistance::KlobucharIonosphericModel; +using TimeModel = android::hardware::gnss::gnss_assistance::TimeModel; +using RealTimeIntegrityModel = android::hardware::gnss::gnss_assistance::RealTimeIntegrityModel; +using AuxiliaryInformation = android::hardware::gnss::gnss_assistance::AuxiliaryInformation; + +void GnssAssistance_class_init_once(JNIEnv* env, jclass clazz); + +class GnssAssistanceInterface { +public: + GnssAssistanceInterface(const sp<IGnssAssistanceInterface>& iGnssAssistance); + jboolean injectGnssAssistance(JNIEnv* env, jobject gnssAssistanceObj); + jboolean setCallback(const sp<IGnssAssistanceCallback>& callback); + +private: + const sp<IGnssAssistanceInterface> mGnssAssistanceInterface; +}; + +struct GnssAssistanceUtil { + static void setGlonassAssistance(JNIEnv* env, jobject glonassAssistanceObj, + GlonassAssistance& galileoAssistance); + static void setGlonassSatelliteEphemeris( + JNIEnv* env, jobject glonassSatelliteEphemerisObj, + std::vector<GlonassSatelliteEphemeris>& glonassSatelliteEphemerisList); + static void setGlonassAlmanac(JNIEnv* env, jobject glonassAlmanacObj, + GlonassAlmanac& glonassAlmanac); + static void setBeidouAssistance(JNIEnv* env, jobject beidouAssistanceObj, + BeidouAssistance& beidouAssistance); + static void setBeidouSatelliteEphemeris( + JNIEnv* env, jobject beidouSatelliteEphemerisObj, + std::vector<BeidouSatelliteEphemeris>& beidouSatelliteEphemerisList); + static void setGalileoAssistance(JNIEnv* env, jobject galileoAssistanceObj, + GalileoAssistance& galileoAssistance); + static void setGalileoSatelliteEphemeris( + JNIEnv* env, jobject galileoSatelliteEphemerisObj, + std::vector<GalileoSatelliteEphemeris>& galileoSatelliteEphemerisList); + static void setGaliloKlobucharIonosphericModel(JNIEnv* env, jobject galileoIonosphericModelObj, + GalileoIonosphericModel& ionosphericModel); + static void setGnssAssistance(JNIEnv* env, jobject gnssAssistanceObj, + GnssAssistance& gnssAssistance); + static void setGpsAssistance(JNIEnv* env, jobject gpsAssistanceObj, + GpsAssistance& gpsAssistance); + template <class T> + static void setGpsOrQzssSatelliteEphemeris(JNIEnv* env, jobject satelliteEphemerisObj, + std::vector<T>& satelliteEphemeris); + static void setQzssAssistance(JNIEnv* env, jobject qzssAssistanceObj, + QzssAssistance& qzssAssistance); + static void setGnssAlmanac(JNIEnv* env, jobject gnssAlmanacObj, GnssAlmanac& gnssAlmanac); + static void setGnssSignalType(JNIEnv* env, jobject gnssSignalTypeObj, + GnssSignalType& gnssSignalType); + static void setKeplerianOrbitModel(JNIEnv* env, jobject keplerianOrbitModelObj, + KeplerianOrbitModel& keplerianOrbitModel); + static void setKlobucharIonosphericModel(JNIEnv* env, jobject klobucharIonosphericModelObj, + KlobucharIonosphericModel& klobucharIonosphericModel); + static void setTimeModels(JNIEnv* env, jobject timeModelsObj, + std::vector<TimeModel>& timeModels); + static void setLeapSecondsModel(JNIEnv* env, jobject leapSecondsModelObj, + LeapSecondsModel& leapSecondsModel); + static void setRealTimeIntegrityModels( + JNIEnv* env, jobject realTimeIntegrityModelsObj, + std::vector<RealTimeIntegrityModel>& realTimeIntegrityModels); + + static void setSatelliteEphemerisTime(JNIEnv* env, jobject satelliteEphemerisTimeObj, + SatelliteEphemerisTime& satelliteEphemerisTime); + static void setUtcModel(JNIEnv* env, jobject utcModelObj, UtcModel& utcModel); + static void setSatelliteCorrections( + JNIEnv* env, jobject satelliteCorrectionsObj, + std::vector<GnssSatelliteCorrections>& satelliteCorrections); + static void setAuxiliaryInformation(JNIEnv* env, jobject auxiliaryInformationObj, + AuxiliaryInformation& auxiliaryInformation); +}; + +} // namespace android::gnss + +#endif // _ANDROID_SERVER_GNSSASSITANCE__H diff --git a/services/core/jni/gnss/GnssAssistanceCallback.cpp b/services/core/jni/gnss/GnssAssistanceCallback.cpp new file mode 100644 index 000000000000..dbb27d72663e --- /dev/null +++ b/services/core/jni/gnss/GnssAssistanceCallback.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "GnssAssistanceCbJni" + +#include "GnssAssistanceCallback.h" + +#include "Utils.h" + +namespace { +jmethodID method_gnssAssistanceInjectRequest; +} // anonymous namespace + +namespace android::gnss { + +using binder::Status; +using hardware::Return; +using hardware::Void; + +void GnssAssistanceCallback_class_init_once(JNIEnv* env, jclass clazz) { + method_gnssAssistanceInjectRequest = + env->GetStaticMethodID(clazz, "gnssAssistanceInjectRequest", "()V"); +} + +// Implementation of android::hardware::gnss::gnss_assistance::GnssAssistanceCallback. + +Status GnssAssistanceCallback::injectRequestCb() { + ALOGD("%s.", __func__); + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_gnssAssistanceInjectRequest); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); +} + +} // namespace android::gnss diff --git a/services/core/jni/gnss/GnssAssistanceCallback.h b/services/core/jni/gnss/GnssAssistanceCallback.h new file mode 100644 index 000000000000..4c8c5fc06730 --- /dev/null +++ b/services/core/jni/gnss/GnssAssistanceCallback.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ANDROID_SERVER_GNSS_GNSSASSITANCECALLBACK_H +#define _ANDROID_SERVER_GNSS_GNSSASSITANCECALLBACK_H + +#pragma once + +#ifndef LOG_TAG +#error LOG_TAG must be defined before including this file. +#endif + +#include <android/hardware/gnss/gnss_assistance/BnGnssAssistanceCallback.h> +#include <log/log.h> + +#include "Utils.h" +#include "jni.h" + +namespace android::gnss { + +void GnssAssistanceCallback_class_init_once(JNIEnv* env, jclass clazz); + +/* + * GnssAssistanceCallback class implements the callback methods required by the + * android::hardware::gnss::gnss_assistance::IGnssAssistanceCallback interface. + */ +class GnssAssistanceCallback : public hardware::gnss::gnss_assistance::BnGnssAssistanceCallback { +public: + GnssAssistanceCallback() {} + binder::Status injectRequestCb() override; +}; + +} // namespace android::gnss + +#endif // _ANDROID_SERVER_GNSS_GNSSASSITANCECALLBACK_H |