• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // Define LOG_TAG before <log/log.h> to overwrite the default value.
18 
19 #define LOG_TAG "GnssAssistanceJni"
20 
21 #include "GnssAssistance.h"
22 
23 #include <utils/String16.h>
24 
25 #include "GnssAssistanceCallback.h"
26 #include "Utils.h"
27 
28 namespace android::gnss {
29 
30 using GnssConstellationType = android::hardware::gnss::GnssConstellationType;
31 using GnssCorrectionComponent = android::hardware::gnss::gnss_assistance::GnssCorrectionComponent;
32 using GnssInterval =
33         android::hardware::gnss::gnss_assistance::GnssCorrectionComponent::GnssInterval;
34 using GnssSatelliteAlmanac =
35         android::hardware::gnss::gnss_assistance::GnssAlmanac::GnssSatelliteAlmanac;
36 using IonosphericCorrection = android::hardware::gnss::gnss_assistance::IonosphericCorrection;
37 using PseudorangeCorrection =
38         android::hardware::gnss::gnss_assistance::GnssCorrectionComponent::PseudorangeCorrection;
39 using GalileoSatelliteClockModel = android::hardware::gnss::gnss_assistance::
40         GalileoSatelliteEphemeris::GalileoSatelliteClockModel;
41 using GalileoSvHealth =
42         android::hardware::gnss::gnss_assistance::GalileoSatelliteEphemeris::GalileoSvHealth;
43 using GlonassSatelliteAlmanac =
44         android::hardware::gnss::gnss_assistance::GlonassAlmanac::GlonassSatelliteAlmanac;
45 using GlonassSatelliteClockModel = android::hardware::gnss::gnss_assistance::
46         GlonassSatelliteEphemeris::GlonassSatelliteClockModel;
47 using GlonassSatelliteOrbitModel = android::hardware::gnss::gnss_assistance::
48         GlonassSatelliteEphemeris::GlonassSatelliteOrbitModel;
49 using GnssSignalType = hardware::gnss::GnssSignalType;
50 using GnssConstellationType = hardware::gnss::GnssConstellationType;
51 using BeidouB1CSatelliteOrbitType =
52         android::hardware::gnss::gnss_assistance::AuxiliaryInformation::BeidouB1CSatelliteOrbitType;
53 using QzssSatelliteEphemeris = android::hardware::gnss::gnss_assistance::QzssSatelliteEphemeris;
54 
55 // Implementation of GnssAssistance (AIDL HAL)
56 
57 namespace {
58 jmethodID method_gnssAssistanceGetGpsAssistance;
59 jmethodID method_gnssAssistanceGetGlonassAssistance;
60 jmethodID method_gnssAssistanceGetGalileoAssistance;
61 jmethodID method_gnssAssistanceGetBeidouAssistance;
62 jmethodID method_gnssAssistanceGetQzssAssistance;
63 
64 jmethodID method_listSize;
65 jmethodID method_listGet;
66 
67 jmethodID method_gnssAlmanacGetIssueDateMillis;
68 jmethodID method_gnssAlmanacGetIoda;
69 jmethodID method_gnssAlmanacGetWeekNumber;
70 jmethodID method_gnssAlmanacGetToaSeconds;
71 jmethodID method_gnssAlmanacGetSatelliteAlmanacs;
72 jmethodID method_gnssAlmanacIsCompleteAlmanacProvided;
73 jmethodID method_satelliteAlmanacGetSvid;
74 jmethodID method_satelliteAlmanacGetSvHealth;
75 jmethodID method_satelliteAlmanacGetAf0;
76 jmethodID method_satelliteAlmanacGetAf1;
77 jmethodID method_satelliteAlmanacGetEccentricity;
78 jmethodID method_satelliteAlmanacGetInclination;
79 jmethodID method_satelliteAlmanacGetM0;
80 jmethodID method_satelliteAlmanacGetOmega;
81 jmethodID method_satelliteAlmanacGetOmega0;
82 jmethodID method_satelliteAlmanacGetOmegaDot;
83 jmethodID method_satelliteAlmanacGetRootA;
84 
85 jmethodID method_satelliteEphemerisTimeGetIode;
86 jmethodID method_satelliteEphemerisTimeGetToeSeconds;
87 jmethodID method_satelliteEphemerisTimeGetWeekNumber;
88 
89 jmethodID method_keplerianOrbitModelGetDeltaN;
90 jmethodID method_keplerianOrbitModelGetEccentricity;
91 jmethodID method_keplerianOrbitModelGetI0;
92 jmethodID method_keplerianOrbitModelGetIDot;
93 jmethodID method_keplerianOrbitModelGetM0;
94 jmethodID method_keplerianOrbitModelGetOmega;
95 jmethodID method_keplerianOrbitModelGetOmega0;
96 jmethodID method_keplerianOrbitModelGetOmegaDot;
97 jmethodID method_keplerianOrbitModelGetRootA;
98 jmethodID method_keplerianOrbitModelGetSecondOrderHarmonicPerturbation;
99 jmethodID method_secondOrderHarmonicPerturbationGetCic;
100 jmethodID method_secondOrderHarmonicPerturbationGetCis;
101 jmethodID method_secondOrderHarmonicPerturbationGetCrc;
102 jmethodID method_secondOrderHarmonicPerturbationGetCrs;
103 jmethodID method_secondOrderHarmonicPerturbationGetCuc;
104 jmethodID method_secondOrderHarmonicPerturbationGetCus;
105 
106 jmethodID method_klobucharIonosphericModelGetAlpha0;
107 jmethodID method_klobucharIonosphericModelGetAlpha1;
108 jmethodID method_klobucharIonosphericModelGetAlpha2;
109 jmethodID method_klobucharIonosphericModelGetAlpha3;
110 jmethodID method_klobucharIonosphericModelGetBeta0;
111 jmethodID method_klobucharIonosphericModelGetBeta1;
112 jmethodID method_klobucharIonosphericModelGetBeta2;
113 jmethodID method_klobucharIonosphericModelGetBeta3;
114 
115 jmethodID method_utcModelGetA0;
116 jmethodID method_utcModelGetA1;
117 jmethodID method_utcModelGetTimeOfWeek;
118 jmethodID method_utcModelGetWeekNumber;
119 
120 jmethodID method_leapSecondsModelGetDayNumberLeapSecondsFuture;
121 jmethodID method_leapSecondsModelGetLeapSeconds;
122 jmethodID method_leapSecondsModelGetLeapSecondsFuture;
123 jmethodID method_leapSecondsModelGetWeekNumberLeapSecondsFuture;
124 
125 jmethodID method_timeModelsGetTimeOfWeek;
126 jmethodID method_timeModelsGetToGnss;
127 jmethodID method_timeModelsGetWeekNumber;
128 jmethodID method_timeModelsGetA0;
129 jmethodID method_timeModelsGetA1;
130 
131 jmethodID method_realTimeIntegrityModelGetBadSvid;
132 jmethodID method_realTimeIntegrityModelGetBadSignalTypes;
133 jmethodID method_realTimeIntegrityModelGetStartDateSeconds;
134 jmethodID method_realTimeIntegrityModelGetEndDateSeconds;
135 jmethodID method_realTimeIntegrityModelGetPublishDateSeconds;
136 jmethodID method_realTimeIntegrityModelGetAdvisoryNumber;
137 jmethodID method_realTimeIntegrityModelGetAdvisoryType;
138 
139 jmethodID method_gnssSignalTypeGetConstellationType;
140 jmethodID method_gnssSignalTypeGetCarrierFrequencyHz;
141 jmethodID method_gnssSignalTypeGetCodeType;
142 
143 jmethodID method_auxiliaryInformationGetSvid;
144 jmethodID method_auxiliaryInformationGetAvailableSignalTypes;
145 jmethodID method_auxiliaryInformationGetFrequencyChannelNumber;
146 jmethodID method_auxiliaryInformationGetSatType;
147 
148 jmethodID method_satelliteCorrectionGetSvid;
149 jmethodID method_satelliteCorrectionGetIonosphericCorrections;
150 jmethodID method_ionosphericCorrectionGetCarrierFrequencyHz;
151 jmethodID method_ionosphericCorrectionGetIonosphericCorrection;
152 jmethodID method_gnssCorrectionComponentGetPseudorangeCorrection;
153 jmethodID method_gnssCorrectionComponentGetSourceKey;
154 jmethodID method_gnssCorrectionComponentGetValidityInterval;
155 jmethodID method_pseudorangeCorrectionGetCorrectionMeters;
156 jmethodID method_pseudorangeCorrectionGetCorrectionUncertaintyMeters;
157 jmethodID method_pseudorangeCorrectionGetCorrectionRateMetersPerSecond;
158 jmethodID method_gnssIntervalGetStartMillisSinceGpsEpoch;
159 jmethodID method_gnssIntervalGetEndMillisSinceGpsEpoch;
160 
161 jmethodID method_gpsAssistanceGetAlmanac;
162 jmethodID method_gpsAssistanceGetIonosphericModel;
163 jmethodID method_gpsAssistanceGetUtcModel;
164 jmethodID method_gpsAssistanceGetLeapSecondsModel;
165 jmethodID method_gpsAssistanceGetTimeModels;
166 jmethodID method_gpsAssistanceGetSatelliteEphemeris;
167 jmethodID method_gpsAssistanceGetRealTimeIntegrityModels;
168 jmethodID method_gpsAssistanceGetSatelliteCorrections;
169 jmethodID method_gpsAssistanceGetAuxiliaryInformation;
170 jmethodID method_gpsSatelliteEphemerisGetSvid;
171 jmethodID method_gpsSatelliteEphemerisGetGpsL2Params;
172 jmethodID method_gpsSatelliteEphemerisGetSatelliteClockModel;
173 jmethodID method_gpsSatelliteEphemerisGetSatelliteOrbitModel;
174 jmethodID method_gpsSatelliteEphemerisGetSatelliteHealth;
175 jmethodID method_gpsSatelliteEphemerisGetSatelliteEphemerisTime;
176 jmethodID method_gpsL2ParamsGetL2Code;
177 jmethodID method_gpsL2ParamsGetL2Flag;
178 jmethodID method_gpsSatelliteClockModelGetAf0;
179 jmethodID method_gpsSatelliteClockModelGetAf1;
180 jmethodID method_gpsSatelliteClockModelGetAf2;
181 jmethodID method_gpsSatelliteClockModelGetTgd;
182 jmethodID method_gpsSatelliteClockModelGetIodc;
183 jmethodID method_gpsSatelliteClockModelGetTimeOfClockSeconds;
184 jmethodID method_gpsSatelliteHealthGetFitInt;
185 jmethodID method_gpsSatelliteHealthGetSvAccur;
186 jmethodID method_gpsSatelliteHealthGetSvHealth;
187 
188 jmethodID method_beidouAssistanceGetAlmanac;
189 jmethodID method_beidouAssistanceGetIonosphericModel;
190 jmethodID method_beidouAssistanceGetUtcModel;
191 jmethodID method_beidouAssistanceGetLeapSecondsModel;
192 jmethodID method_beidouAssistanceGetTimeModels;
193 jmethodID method_beidouAssistanceGetSatelliteEphemeris;
194 jmethodID method_beidouAssistanceGetSatelliteCorrections;
195 jmethodID method_beidouAssistanceGetRealTimeIntegrityModels;
196 jmethodID method_beidouAssistanceGetAuxiliaryInformation;
197 jmethodID method_beidouSatelliteEphemerisGetSvid;
198 jmethodID method_beidouSatelliteEphemerisGetSatelliteClockModel;
199 jmethodID method_beidouSatelliteEphemerisGetSatelliteOrbitModel;
200 jmethodID method_beidouSatelliteEphemerisGetSatelliteHealth;
201 jmethodID method_beidouSatelliteEphemerisGetSatelliteEphemerisTime;
202 jmethodID method_beidouSatelliteClockModelGetAf0;
203 jmethodID method_beidouSatelliteClockModelGetAf1;
204 jmethodID method_beidouSatelliteClockModelGetAf2;
205 jmethodID method_beidouSatelliteClockModelGetAodc;
206 jmethodID method_beidouSatelliteClockModelGetTgd1;
207 jmethodID method_beidouSatelliteClockModelGetTgd2;
208 jmethodID method_beidouSatelliteClockModelGetTimeOfClockSeconds;
209 jmethodID method_beidouSatelliteHealthGetSatH1;
210 jmethodID method_beidouSatelliteHealthGetSvAccur;
211 jmethodID method_beidouSatelliteEphemerisTimeGetAode;
212 jmethodID method_beidouSatelliteEphemerisTimeGetBeidouWeekNumber;
213 jmethodID method_beidouSatelliteEphemerisTimeGetToeSeconds;
214 
215 jmethodID method_galileoAssistanceGetAlmanac;
216 jmethodID method_galileoAssistanceGetIonosphericModel;
217 jmethodID method_galileoAssistanceGetUtcModel;
218 jmethodID method_galileoAssistanceGetLeapSecondsModel;
219 jmethodID method_galileoAssistanceGetTimeModels;
220 jmethodID method_galileoAssistanceGetSatelliteEphemeris;
221 jmethodID method_galileoAssistanceGetSatelliteCorrections;
222 jmethodID method_galileoAssistanceGetRealTimeIntegrityModels;
223 jmethodID method_galileoAssistanceGetAuxiliaryInformation;
224 jmethodID method_galileoSatelliteEphemerisGetSvid;
225 jmethodID method_galileoSatelliteEphemerisGetSatelliteClockModels;
226 jmethodID method_galileoSatelliteEphemerisGetSatelliteOrbitModel;
227 jmethodID method_galileoSatelliteEphemerisGetSatelliteHealth;
228 jmethodID method_galileoSatelliteEphemerisGetSatelliteEphemerisTime;
229 jmethodID method_galileoSatelliteClockModelGetAf0;
230 jmethodID method_galileoSatelliteClockModelGetAf1;
231 jmethodID method_galileoSatelliteClockModelGetAf2;
232 jmethodID method_galileoSatelliteClockModelGetBgdSeconds;
233 jmethodID method_galileoSatelliteClockModelGetSatelliteClockType;
234 jmethodID method_galileoSatelliteClockModelGetSisaMeters;
235 jmethodID method_galileoSatelliteClockModelGetTimeOfClockSeconds;
236 jmethodID method_galileoSvHealthGetDataValidityStatusE1b;
237 jmethodID method_galileoSvHealthGetDataValidityStatusE5a;
238 jmethodID method_galileoSvHealthGetDataValidityStatusE5b;
239 jmethodID method_galileoSvHealthGetSignalHealthStatusE1b;
240 jmethodID method_galileoSvHealthGetSignalHealthStatusE5a;
241 jmethodID method_galileoSvHealthGetSignalHealthStatusE5b;
242 jmethodID method_galileoIonosphericModelGetAi0;
243 jmethodID method_galileoIonosphericModelGetAi1;
244 jmethodID method_galileoIonosphericModelGetAi2;
245 
246 jmethodID method_glonassAssistanceGetAlmanac;
247 jmethodID method_glonassAssistanceGetUtcModel;
248 jmethodID method_glonassAssistanceGetTimeModels;
249 jmethodID method_glonassAssistanceGetSatelliteEphemeris;
250 jmethodID method_glonassAssistanceGetSatelliteCorrections;
251 jmethodID method_glonassAssistanceGetRealTimeIntegrityModels;
252 jmethodID method_glonassAssistanceGetAuxiliaryInformation;
253 jmethodID method_glonassAlmanacGetIssueDateMillis;
254 jmethodID method_glonassAlmanacGetSatelliteAlmanacs;
255 jmethodID method_glonassSatelliteAlmanacGetDeltaI;
256 jmethodID method_glonassSatelliteAlmanacGetDeltaT;
257 jmethodID method_glonassSatelliteAlmanacGetDeltaTDot;
258 jmethodID method_glonassSatelliteAlmanacGetEccentricity;
259 jmethodID method_glonassSatelliteAlmanacGetFrequencyChannelNumber;
260 jmethodID method_glonassSatelliteAlmanacGetLambda;
261 jmethodID method_glonassSatelliteAlmanacGetOmega;
262 jmethodID method_glonassSatelliteAlmanacGetSlotNumber;
263 jmethodID method_glonassSatelliteAlmanacGetHealthState;
264 jmethodID method_glonassSatelliteAlmanacGetTLambda;
265 jmethodID method_glonassSatelliteAlmanacGetTau;
266 jmethodID method_glonassSatelliteAlmanacGetIsGlonassM;
267 jmethodID method_glonassSatelliteAlmanacGetCalendarDayNumber;
268 jmethodID method_glonassSatelliteEphemerisGetAgeInDays;
269 jmethodID method_glonassSatelliteEphemerisGetSatelliteClockModel;
270 jmethodID method_glonassSatelliteEphemerisGetSatelliteOrbitModel;
271 jmethodID method_glonassSatelliteEphemerisGetHealthState;
272 jmethodID method_glonassSatelliteEphemerisGetSlotNumber;
273 jmethodID method_glonassSatelliteEphemerisGetFrameTimeSeconds;
274 jmethodID method_glonassSatelliteEphemerisGetUpdateIntervalMinutes;
275 jmethodID method_glonassSatelliteEphemerisGetIsGlonassM;
276 jmethodID method_glonassSatelliteEphemerisGetIsUpdateIntervalOdd;
277 
278 jmethodID method_glonassSatelliteOrbitModelGetX;
279 jmethodID method_glonassSatelliteOrbitModelGetY;
280 jmethodID method_glonassSatelliteOrbitModelGetZ;
281 jmethodID method_glonassSatelliteOrbitModelGetXAccel;
282 jmethodID method_glonassSatelliteOrbitModelGetYAccel;
283 jmethodID method_glonassSatelliteOrbitModelGetZAccel;
284 jmethodID method_glonassSatelliteOrbitModelGetXDot;
285 jmethodID method_glonassSatelliteOrbitModelGetYDot;
286 jmethodID method_glonassSatelliteOrbitModelGetZDot;
287 jmethodID method_glonassSatelliteClockModelGetClockBias;
288 jmethodID method_glonassSatelliteClockModelGetFrequencyBias;
289 jmethodID method_glonassSatelliteClockModelGetFrequencyChannelNumber;
290 jmethodID method_glonassSatelliteClockModelGetTimeOfClockSeconds;
291 
292 jmethodID method_qzssAssistanceGetAlmanac;
293 jmethodID method_qzssAssistanceGetIonosphericModel;
294 jmethodID method_qzssAssistanceGetUtcModel;
295 jmethodID method_qzssAssistanceGetLeapSecondsModel;
296 jmethodID method_qzssAssistanceGetTimeModels;
297 jmethodID method_qzssAssistanceGetSatelliteEphemeris;
298 jmethodID method_qzssAssistanceGetSatelliteCorrections;
299 jmethodID method_qzssAssistanceGetAuxiliaryInformation;
300 jmethodID method_qzssAssistanceGetRealTimeIntegrityModels;
301 jmethodID method_qzssSatelliteEphemerisGetSvid;
302 jmethodID method_qzssSatelliteEphemerisGetGpsL2Params;
303 jmethodID method_qzssSatelliteEphemerisGetSatelliteClockModel;
304 jmethodID method_qzssSatelliteEphemerisGetSatelliteOrbitModel;
305 jmethodID method_qzssSatelliteEphemerisGetSatelliteHealth;
306 jmethodID method_qzssSatelliteEphemerisGetSatelliteEphemerisTime;
307 jmethodID method_qzssSatelliteClockModelGetAf0;
308 jmethodID method_qzssSatelliteClockModelGetAf1;
309 jmethodID method_qzssSatelliteClockModelGetAf2;
310 jmethodID method_qzssSatelliteClockModelGetAodc;
311 jmethodID method_qzssSatelliteClockModelGetTgd1;
312 jmethodID method_qzssSatelliteClockModelGetTgd2;
313 jmethodID method_qzssSatelliteClockModelGetTimeOfClockSeconds;
314 } // namespace
315 
GnssAssistance_class_init_once(JNIEnv * env,jclass clazz)316 void GnssAssistance_class_init_once(JNIEnv* env, jclass clazz) {
317     // Get the methods of GnssAssistance class.
318     jclass gnssAssistanceClass = env->FindClass("android/location/GnssAssistance");
319 
320     method_gnssAssistanceGetGpsAssistance =
321             env->GetMethodID(gnssAssistanceClass, "getGpsAssistance",
322                              "()Landroid/location/GpsAssistance;");
323     method_gnssAssistanceGetGlonassAssistance =
324             env->GetMethodID(gnssAssistanceClass, "getGlonassAssistance",
325                              "()Landroid/location/GlonassAssistance;");
326     method_gnssAssistanceGetGalileoAssistance =
327             env->GetMethodID(gnssAssistanceClass, "getGalileoAssistance",
328                              "()Landroid/location/GalileoAssistance;");
329     method_gnssAssistanceGetBeidouAssistance =
330             env->GetMethodID(gnssAssistanceClass, "getBeidouAssistance",
331                              "()Landroid/location/BeidouAssistance;");
332     method_gnssAssistanceGetQzssAssistance =
333             env->GetMethodID(gnssAssistanceClass, "getQzssAssistance",
334                              "()Landroid/location/QzssAssistance;");
335 
336     // Get the methods of List class.
337     jclass listClass = env->FindClass("java/util/List");
338 
339     method_listSize = env->GetMethodID(listClass, "size", "()I");
340     method_listGet = env->GetMethodID(listClass, "get", "(I)Ljava/lang/Object;");
341 
342     // Get the methods of GnssAlmanac class.
343     jclass gnssAlmanacClass = env->FindClass("android/location/GnssAlmanac");
344 
345     method_gnssAlmanacGetIssueDateMillis =
346             env->GetMethodID(gnssAlmanacClass, "getIssueDateMillis", "()J");
347     method_gnssAlmanacGetIoda = env->GetMethodID(gnssAlmanacClass, "getIoda", "()I");
348     method_gnssAlmanacGetWeekNumber = env->GetMethodID(gnssAlmanacClass, "getWeekNumber", "()I");
349     method_gnssAlmanacGetToaSeconds = env->GetMethodID(gnssAlmanacClass, "getToaSeconds", "()I");
350     method_gnssAlmanacGetSatelliteAlmanacs =
351             env->GetMethodID(gnssAlmanacClass, "getGnssSatelliteAlmanacs", "()Ljava/util/List;");
352     method_gnssAlmanacIsCompleteAlmanacProvided =
353             env->GetMethodID(gnssAlmanacClass, "isCompleteAlmanacProvided", "()Z");
354 
355     // Get the methods of SatelliteAlmanac class.
356     jclass satelliteAlmanacClass =
357             env->FindClass("android/location/GnssAlmanac$GnssSatelliteAlmanac");
358 
359     method_satelliteAlmanacGetSvid = env->GetMethodID(satelliteAlmanacClass, "getSvid", "()I");
360     method_satelliteAlmanacGetSvHealth =
361             env->GetMethodID(satelliteAlmanacClass, "getSvHealth", "()I");
362     method_satelliteAlmanacGetAf0 = env->GetMethodID(satelliteAlmanacClass, "getAf0", "()D");
363     method_satelliteAlmanacGetAf1 = env->GetMethodID(satelliteAlmanacClass, "getAf1", "()D");
364     method_satelliteAlmanacGetEccentricity =
365             env->GetMethodID(satelliteAlmanacClass, "getEccentricity", "()D");
366     method_satelliteAlmanacGetInclination =
367             env->GetMethodID(satelliteAlmanacClass, "getInclination", "()D");
368     method_satelliteAlmanacGetM0 = env->GetMethodID(satelliteAlmanacClass, "getM0", "()D");
369     method_satelliteAlmanacGetOmega = env->GetMethodID(satelliteAlmanacClass, "getOmega", "()D");
370     method_satelliteAlmanacGetOmega0 = env->GetMethodID(satelliteAlmanacClass, "getOmega0", "()D");
371     method_satelliteAlmanacGetOmegaDot =
372             env->GetMethodID(satelliteAlmanacClass, "getOmegaDot", "()D");
373     method_satelliteAlmanacGetRootA = env->GetMethodID(satelliteAlmanacClass, "getRootA", "()D");
374 
375     // Get the mothods of SatelliteEphemerisTime class.
376     jclass satelliteEphemerisTimeClass = env->FindClass("android/location/SatelliteEphemerisTime");
377 
378     method_satelliteEphemerisTimeGetIode =
379             env->GetMethodID(satelliteEphemerisTimeClass, "getIode", "()I");
380     method_satelliteEphemerisTimeGetToeSeconds =
381             env->GetMethodID(satelliteEphemerisTimeClass, "getToeSeconds", "()I");
382     method_satelliteEphemerisTimeGetWeekNumber =
383             env->GetMethodID(satelliteEphemerisTimeClass, "getWeekNumber", "()I");
384 
385     // Get the mothods of KeplerianOrbitModel class.
386     jclass keplerianOrbitModelClass = env->FindClass("android/location/KeplerianOrbitModel");
387 
388     method_keplerianOrbitModelGetDeltaN =
389             env->GetMethodID(keplerianOrbitModelClass, "getDeltaN", "()D");
390     method_keplerianOrbitModelGetEccentricity =
391             env->GetMethodID(keplerianOrbitModelClass, "getEccentricity", "()D");
392     method_keplerianOrbitModelGetI0 = env->GetMethodID(keplerianOrbitModelClass, "getI0", "()D");
393     method_keplerianOrbitModelGetIDot =
394             env->GetMethodID(keplerianOrbitModelClass, "getIDot", "()D");
395     method_keplerianOrbitModelGetM0 = env->GetMethodID(keplerianOrbitModelClass, "getM0", "()D");
396     method_keplerianOrbitModelGetOmega =
397             env->GetMethodID(keplerianOrbitModelClass, "getOmega", "()D");
398     method_keplerianOrbitModelGetOmega0 =
399             env->GetMethodID(keplerianOrbitModelClass, "getOmega0", "()D");
400     method_keplerianOrbitModelGetOmegaDot =
401             env->GetMethodID(keplerianOrbitModelClass, "getOmegaDot", "()D");
402     method_keplerianOrbitModelGetRootA =
403             env->GetMethodID(keplerianOrbitModelClass, "getRootA", "()D");
404     method_keplerianOrbitModelGetSecondOrderHarmonicPerturbation =
405             env->GetMethodID(keplerianOrbitModelClass, "getSecondOrderHarmonicPerturbation",
406                              "()Landroid/location/"
407                              "KeplerianOrbitModel$SecondOrderHarmonicPerturbation;");
408 
409     // Get the methods of SecondOrderHarmonicPerturbation class.
410     jclass secondOrderHarmonicPerturbationClass =
411             env->FindClass("android/location/KeplerianOrbitModel$SecondOrderHarmonicPerturbation");
412 
413     method_secondOrderHarmonicPerturbationGetCic =
414             env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCic", "()D");
415     method_secondOrderHarmonicPerturbationGetCis =
416             env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCis", "()D");
417     method_secondOrderHarmonicPerturbationGetCrc =
418             env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCrc", "()D");
419     method_secondOrderHarmonicPerturbationGetCrs =
420             env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCrs", "()D");
421     method_secondOrderHarmonicPerturbationGetCuc =
422             env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCuc", "()D");
423     method_secondOrderHarmonicPerturbationGetCus =
424             env->GetMethodID(secondOrderHarmonicPerturbationClass, "getCus", "()D");
425 
426     // Get the methods of KlobucharIonosphericModel class.
427     jclass klobucharIonosphericModelClass =
428             env->FindClass("android/location/KlobucharIonosphericModel");
429 
430     method_klobucharIonosphericModelGetAlpha0 =
431             env->GetMethodID(klobucharIonosphericModelClass, "getAlpha0", "()D");
432     method_klobucharIonosphericModelGetAlpha1 =
433             env->GetMethodID(klobucharIonosphericModelClass, "getAlpha1", "()D");
434     method_klobucharIonosphericModelGetAlpha2 =
435             env->GetMethodID(klobucharIonosphericModelClass, "getAlpha2", "()D");
436     method_klobucharIonosphericModelGetAlpha3 =
437             env->GetMethodID(klobucharIonosphericModelClass, "getAlpha3", "()D");
438     method_klobucharIonosphericModelGetBeta0 =
439             env->GetMethodID(klobucharIonosphericModelClass, "getBeta0", "()D");
440     method_klobucharIonosphericModelGetBeta1 =
441             env->GetMethodID(klobucharIonosphericModelClass, "getBeta1", "()D");
442     method_klobucharIonosphericModelGetBeta2 =
443             env->GetMethodID(klobucharIonosphericModelClass, "getBeta2", "()D");
444     method_klobucharIonosphericModelGetBeta3 =
445             env->GetMethodID(klobucharIonosphericModelClass, "getBeta3", "()D");
446 
447     // Get the methods of UtcModel class.
448     jclass utcModelClass = env->FindClass("android/location/UtcModel");
449 
450     method_utcModelGetA0 = env->GetMethodID(utcModelClass, "getA0", "()D");
451     method_utcModelGetA1 = env->GetMethodID(utcModelClass, "getA1", "()D");
452     method_utcModelGetTimeOfWeek = env->GetMethodID(utcModelClass, "getTimeOfWeek", "()I");
453     method_utcModelGetWeekNumber = env->GetMethodID(utcModelClass, "getWeekNumber", "()I");
454 
455     // Get the methods of LeapSecondsModel class.
456     jclass leapSecondsModelClass = env->FindClass("android/location/LeapSecondsModel");
457 
458     method_leapSecondsModelGetDayNumberLeapSecondsFuture =
459             env->GetMethodID(leapSecondsModelClass, "getDayNumberLeapSecondsFuture", "()I");
460     method_leapSecondsModelGetLeapSeconds =
461             env->GetMethodID(leapSecondsModelClass, "getLeapSeconds", "()I");
462     method_leapSecondsModelGetLeapSecondsFuture =
463             env->GetMethodID(leapSecondsModelClass, "getLeapSecondsFuture", "()I");
464     method_leapSecondsModelGetWeekNumberLeapSecondsFuture =
465             env->GetMethodID(leapSecondsModelClass, "getWeekNumberLeapSecondsFuture", "()I");
466 
467     // Get the methods of TimeModel class.
468     jclass timeModelsClass = env->FindClass("android/location/TimeModel");
469 
470     method_timeModelsGetTimeOfWeek = env->GetMethodID(timeModelsClass, "getTimeOfWeek", "()I");
471     method_timeModelsGetToGnss = env->GetMethodID(timeModelsClass, "getToGnss", "()I");
472     method_timeModelsGetWeekNumber = env->GetMethodID(timeModelsClass, "getWeekNumber", "()I");
473     method_timeModelsGetA0 = env->GetMethodID(timeModelsClass, "getA0", "()D");
474     method_timeModelsGetA1 = env->GetMethodID(timeModelsClass, "getA1", "()D");
475 
476     // Get the methods of AuxiliaryInformation class.
477     jclass auxiliaryInformationClass = env->FindClass("android/location/AuxiliaryInformation");
478 
479     method_auxiliaryInformationGetSvid =
480             env->GetMethodID(auxiliaryInformationClass, "getSvid", "()I");
481     method_auxiliaryInformationGetAvailableSignalTypes =
482             env->GetMethodID(auxiliaryInformationClass, "getAvailableSignalTypes",
483                              "()Ljava/util/List;");
484     method_auxiliaryInformationGetFrequencyChannelNumber =
485             env->GetMethodID(auxiliaryInformationClass, "getFrequencyChannelNumber", "()I");
486     method_auxiliaryInformationGetSatType =
487             env->GetMethodID(auxiliaryInformationClass, "getSatType", "()I");
488 
489     // Get the methods of RealTimeIntegrityModel
490     jclass realTimeIntegrityModelClass = env->FindClass("android/location/RealTimeIntegrityModel");
491 
492     method_realTimeIntegrityModelGetBadSvid =
493             env->GetMethodID(realTimeIntegrityModelClass, "getBadSvid", "()I");
494     method_realTimeIntegrityModelGetBadSignalTypes =
495             env->GetMethodID(realTimeIntegrityModelClass, "getBadSignalTypes",
496                              "()Ljava/util/List;");
497     method_realTimeIntegrityModelGetStartDateSeconds =
498             env->GetMethodID(realTimeIntegrityModelClass, "getStartDateSeconds", "()J");
499     method_realTimeIntegrityModelGetEndDateSeconds =
500             env->GetMethodID(realTimeIntegrityModelClass, "getEndDateSeconds", "()J");
501     method_realTimeIntegrityModelGetPublishDateSeconds =
502             env->GetMethodID(realTimeIntegrityModelClass, "getPublishDateSeconds", "()J");
503     method_realTimeIntegrityModelGetAdvisoryNumber =
504             env->GetMethodID(realTimeIntegrityModelClass, "getAdvisoryNumber",
505                              "()Ljava/lang/String;");
506     method_realTimeIntegrityModelGetAdvisoryType =
507             env->GetMethodID(realTimeIntegrityModelClass, "getAdvisoryType",
508                              "()Ljava/lang/String;");
509 
510     // Get the methods of GnssSignalType class.
511     jclass gnssSignalTypeClass = env->FindClass("android/location/GnssSignalType");
512 
513     method_gnssSignalTypeGetConstellationType =
514             env->GetMethodID(gnssSignalTypeClass, "getConstellationType", "()I");
515     method_gnssSignalTypeGetCarrierFrequencyHz =
516             env->GetMethodID(gnssSignalTypeClass, "getCarrierFrequencyHz", "()D");
517     method_gnssSignalTypeGetCodeType =
518             env->GetMethodID(gnssSignalTypeClass, "getCodeType", "()Ljava/lang/String;");
519 
520     // Get the methods of SatelliteCorrection class.
521     jclass satelliteCorrectionClass =
522             env->FindClass("android/location/GnssAssistance$GnssSatelliteCorrections");
523 
524     method_satelliteCorrectionGetSvid =
525             env->GetMethodID(satelliteCorrectionClass, "getSvid", "()I");
526     method_satelliteCorrectionGetIonosphericCorrections =
527             env->GetMethodID(satelliteCorrectionClass, "getIonosphericCorrections",
528                              "()Ljava/util/List;");
529 
530     // Get the methods of IonosphericCorrection class.
531     jclass ionosphericCorrectionClass = env->FindClass("android/location/IonosphericCorrection");
532 
533     method_ionosphericCorrectionGetCarrierFrequencyHz =
534             env->GetMethodID(ionosphericCorrectionClass, "getCarrierFrequencyHz", "()J");
535     method_ionosphericCorrectionGetIonosphericCorrection =
536             env->GetMethodID(ionosphericCorrectionClass, "getIonosphericCorrection",
537                              "()Landroid/location/GnssCorrectionComponent;");
538 
539     // Get the methods of GnssCorrectionComponent class.
540     jclass gnssCorrectionComponentClass =
541             env->FindClass("android/location/GnssCorrectionComponent");
542 
543     method_gnssCorrectionComponentGetPseudorangeCorrection =
544             env->GetMethodID(gnssCorrectionComponentClass, "getPseudorangeCorrection",
545                              "()Landroid/location/GnssCorrectionComponent$PseudorangeCorrection;");
546     method_gnssCorrectionComponentGetSourceKey =
547             env->GetMethodID(gnssCorrectionComponentClass, "getSourceKey", "()Ljava/lang/String;");
548     method_gnssCorrectionComponentGetValidityInterval =
549             env->GetMethodID(gnssCorrectionComponentClass, "getValidityInterval",
550                              "()Landroid/location/GnssCorrectionComponent$GnssInterval;");
551 
552     // Get the methods of PseudorangeCorrection class.
553     jclass pseudorangeCorrectionClass =
554             env->FindClass("android/location/GnssCorrectionComponent$PseudorangeCorrection");
555 
556     method_pseudorangeCorrectionGetCorrectionMeters =
557             env->GetMethodID(pseudorangeCorrectionClass, "getCorrectionMeters", "()D");
558     method_pseudorangeCorrectionGetCorrectionRateMetersPerSecond =
559             env->GetMethodID(pseudorangeCorrectionClass, "getCorrectionRateMetersPerSecond", "()D");
560     method_pseudorangeCorrectionGetCorrectionUncertaintyMeters =
561             env->GetMethodID(pseudorangeCorrectionClass, "getCorrectionUncertaintyMeters", "()D");
562 
563     // Get the methods of GnssInterval class.
564     jclass gnssIntervalClass =
565             env->FindClass("android/location/GnssCorrectionComponent$GnssInterval");
566 
567     method_gnssIntervalGetStartMillisSinceGpsEpoch =
568             env->GetMethodID(gnssIntervalClass, "getStartMillisSinceGpsEpoch", "()J");
569     method_gnssIntervalGetEndMillisSinceGpsEpoch =
570             env->GetMethodID(gnssIntervalClass, "getEndMillisSinceGpsEpoch", "()J");
571 
572     // Get the methods of GpsAssistance class.
573     jclass gpsAssistanceClass = env->FindClass("android/location/GpsAssistance");
574 
575     method_gpsAssistanceGetAlmanac =
576             env->GetMethodID(gpsAssistanceClass, "getAlmanac", "()Landroid/location/GnssAlmanac;");
577     method_gpsAssistanceGetIonosphericModel =
578             env->GetMethodID(gpsAssistanceClass, "getIonosphericModel",
579                              "()Landroid/location/KlobucharIonosphericModel;");
580     method_gpsAssistanceGetUtcModel =
581             env->GetMethodID(gpsAssistanceClass, "getUtcModel", "()Landroid/location/UtcModel;");
582     method_gpsAssistanceGetLeapSecondsModel =
583             env->GetMethodID(gpsAssistanceClass, "getLeapSecondsModel",
584                              "()Landroid/location/LeapSecondsModel;");
585     method_gpsAssistanceGetTimeModels =
586             env->GetMethodID(gpsAssistanceClass, "getTimeModels", "()Ljava/util/List;");
587     method_gpsAssistanceGetSatelliteEphemeris =
588             env->GetMethodID(gpsAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;");
589     method_gpsAssistanceGetRealTimeIntegrityModels =
590             env->GetMethodID(gpsAssistanceClass, "getRealTimeIntegrityModels",
591                              "()Ljava/util/List;");
592     method_gpsAssistanceGetSatelliteCorrections =
593             env->GetMethodID(gpsAssistanceClass, "getSatelliteCorrections", "()Ljava/util/List;");
594     method_gpsAssistanceGetAuxiliaryInformation =
595             env->GetMethodID(gpsAssistanceClass, "getAuxiliaryInformation", "()Ljava/util/List;");
596 
597     // Get the methods of GpsSatelliteEphemeris class.
598     jclass gpsSatelliteEphemerisClass = env->FindClass("android/location/GpsSatelliteEphemeris");
599 
600     method_gpsSatelliteEphemerisGetSvid =
601             env->GetMethodID(gpsSatelliteEphemerisClass, "getSvid", "()I");
602     method_gpsSatelliteEphemerisGetGpsL2Params =
603             env->GetMethodID(gpsSatelliteEphemerisClass, "getGpsL2Params",
604                              "()Landroid/location/GpsSatelliteEphemeris$GpsL2Params;");
605     method_gpsSatelliteEphemerisGetSatelliteClockModel =
606             env->GetMethodID(gpsSatelliteEphemerisClass, "getSatelliteClockModel",
607                              "()Landroid/location/GpsSatelliteEphemeris$GpsSatelliteClockModel;");
608     method_gpsSatelliteEphemerisGetSatelliteOrbitModel =
609             env->GetMethodID(gpsSatelliteEphemerisClass, "getSatelliteOrbitModel",
610                              "()Landroid/location/KeplerianOrbitModel;");
611     method_gpsSatelliteEphemerisGetSatelliteHealth =
612             env->GetMethodID(gpsSatelliteEphemerisClass, "getSatelliteHealth",
613                              "()Landroid/location/GpsSatelliteEphemeris$GpsSatelliteHealth;");
614     method_gpsSatelliteEphemerisGetSatelliteEphemerisTime =
615             env->GetMethodID(gpsSatelliteEphemerisClass, "getSatelliteEphemerisTime",
616                              "()Landroid/location/SatelliteEphemerisTime;");
617 
618     // Get the methods of GpsL2Params class.
619     jclass gpsL2ParamsClass = env->FindClass("android/location/GpsSatelliteEphemeris$GpsL2Params");
620     method_gpsL2ParamsGetL2Code = env->GetMethodID(gpsL2ParamsClass, "getL2Code", "()I");
621     method_gpsL2ParamsGetL2Flag = env->GetMethodID(gpsL2ParamsClass, "getL2Flag", "()I");
622 
623     // Get the methods of GpsSatelliteClockModel class.
624     jclass gpsSatelliteClockModelClass =
625             env->FindClass("android/location/GpsSatelliteEphemeris$GpsSatelliteClockModel");
626     method_gpsSatelliteClockModelGetAf0 =
627             env->GetMethodID(gpsSatelliteClockModelClass, "getAf0", "()D");
628     method_gpsSatelliteClockModelGetAf1 =
629             env->GetMethodID(gpsSatelliteClockModelClass, "getAf1", "()D");
630     method_gpsSatelliteClockModelGetAf2 =
631             env->GetMethodID(gpsSatelliteClockModelClass, "getAf2", "()D");
632     method_gpsSatelliteClockModelGetTgd =
633             env->GetMethodID(gpsSatelliteClockModelClass, "getTgd", "()D");
634     method_gpsSatelliteClockModelGetIodc =
635             env->GetMethodID(gpsSatelliteClockModelClass, "getIodc", "()I");
636     method_gpsSatelliteClockModelGetTimeOfClockSeconds =
637             env->GetMethodID(gpsSatelliteClockModelClass, "getTimeOfClockSeconds", "()J");
638 
639     // Get the methods of GpsSatelliteHealth class.
640     jclass gpsSatelliteHealthClass =
641             env->FindClass("android/location/GpsSatelliteEphemeris$GpsSatelliteHealth");
642     method_gpsSatelliteHealthGetFitInt =
643             env->GetMethodID(gpsSatelliteHealthClass, "getFitInt", "()D");
644     method_gpsSatelliteHealthGetSvAccur =
645             env->GetMethodID(gpsSatelliteHealthClass, "getSvAccur", "()D");
646     method_gpsSatelliteHealthGetSvHealth =
647             env->GetMethodID(gpsSatelliteHealthClass, "getSvHealth", "()I");
648 
649     // Get the methods of BeidouAssistance class.
650     jclass beidouAssistanceClass = env->FindClass("android/location/BeidouAssistance");
651     method_beidouAssistanceGetAlmanac = env->GetMethodID(beidouAssistanceClass, "getAlmanac",
652                                                          "()Landroid/location/GnssAlmanac;");
653     method_beidouAssistanceGetIonosphericModel =
654             env->GetMethodID(beidouAssistanceClass, "getIonosphericModel",
655                              "()Landroid/location/KlobucharIonosphericModel;");
656     method_beidouAssistanceGetUtcModel =
657             env->GetMethodID(beidouAssistanceClass, "getUtcModel", "()Landroid/location/UtcModel;");
658     method_beidouAssistanceGetLeapSecondsModel =
659             env->GetMethodID(beidouAssistanceClass, "getLeapSecondsModel",
660                              "()Landroid/location/LeapSecondsModel;");
661     method_beidouAssistanceGetTimeModels =
662             env->GetMethodID(beidouAssistanceClass, "getTimeModels", "()Ljava/util/List;");
663     method_beidouAssistanceGetSatelliteEphemeris =
664             env->GetMethodID(beidouAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;");
665     method_beidouAssistanceGetSatelliteCorrections =
666             env->GetMethodID(beidouAssistanceClass, "getSatelliteCorrections",
667                              "()Ljava/util/List;");
668     method_beidouAssistanceGetRealTimeIntegrityModels =
669             env->GetMethodID(beidouAssistanceClass, "getRealTimeIntegrityModels",
670                              "()Ljava/util/List;");
671     method_beidouAssistanceGetAuxiliaryInformation =
672             env->GetMethodID(beidouAssistanceClass, "getAuxiliaryInformation",
673                              "()Ljava/util/List;");
674 
675     // Get the methods of BeidouSatelliteEphemeris class.
676     jclass beidouSatelliteEphemerisClass =
677             env->FindClass("android/location/BeidouSatelliteEphemeris");
678     method_beidouSatelliteEphemerisGetSvid =
679             env->GetMethodID(beidouSatelliteEphemerisClass, "getSvid", "()I");
680     method_beidouSatelliteEphemerisGetSatelliteClockModel =
681             env->GetMethodID(beidouSatelliteEphemerisClass, "getSatelliteClockModel",
682                              "()Landroid/location/"
683                              "BeidouSatelliteEphemeris$BeidouSatelliteClockModel;");
684     method_beidouSatelliteEphemerisGetSatelliteOrbitModel =
685             env->GetMethodID(beidouSatelliteEphemerisClass, "getSatelliteOrbitModel",
686                              "()Landroid/location/KeplerianOrbitModel;");
687     method_beidouSatelliteEphemerisGetSatelliteHealth =
688             env->GetMethodID(beidouSatelliteEphemerisClass, "getSatelliteHealth",
689                              "()Landroid/location/BeidouSatelliteEphemeris$BeidouSatelliteHealth;");
690     method_beidouSatelliteEphemerisGetSatelliteEphemerisTime =
691             env->GetMethodID(beidouSatelliteEphemerisClass, "getSatelliteEphemerisTime",
692                              "()Landroid/location/"
693                              "BeidouSatelliteEphemeris$BeidouSatelliteEphemerisTime;");
694 
695     // Get the methods of BeidouSatelliteClockModel
696     jclass beidouSatelliteClockModelClass =
697             env->FindClass("android/location/BeidouSatelliteEphemeris$BeidouSatelliteClockModel");
698     method_beidouSatelliteClockModelGetAf0 =
699             env->GetMethodID(beidouSatelliteClockModelClass, "getAf0", "()D");
700     method_beidouSatelliteClockModelGetAf1 =
701             env->GetMethodID(beidouSatelliteClockModelClass, "getAf1", "()D");
702     method_beidouSatelliteClockModelGetAf2 =
703             env->GetMethodID(beidouSatelliteClockModelClass, "getAf2", "()D");
704     method_beidouSatelliteClockModelGetAodc =
705             env->GetMethodID(beidouSatelliteClockModelClass, "getAodc", "()I");
706     method_beidouSatelliteClockModelGetTgd1 =
707             env->GetMethodID(beidouSatelliteClockModelClass, "getTgd1", "()D");
708     method_beidouSatelliteClockModelGetTgd2 =
709             env->GetMethodID(beidouSatelliteClockModelClass, "getTgd2", "()D");
710     method_beidouSatelliteClockModelGetTimeOfClockSeconds =
711             env->GetMethodID(beidouSatelliteClockModelClass, "getTimeOfClockSeconds", "()J");
712 
713     // Get the methods of BeidouSatelliteHealth
714     jclass beidouSatelliteHealthClass =
715             env->FindClass("android/location/BeidouSatelliteEphemeris$BeidouSatelliteHealth");
716     method_beidouSatelliteHealthGetSatH1 =
717             env->GetMethodID(beidouSatelliteHealthClass, "getSatH1", "()I");
718     method_beidouSatelliteHealthGetSvAccur =
719             env->GetMethodID(beidouSatelliteHealthClass, "getSvAccur", "()D");
720 
721     // Get the methods of BeidouSatelliteEphemerisTime
722     jclass beidouSatelliteEphemerisTimeClass = env->FindClass(
723             "android/location/BeidouSatelliteEphemeris$BeidouSatelliteEphemerisTime");
724     method_beidouSatelliteEphemerisTimeGetAode =
725             env->GetMethodID(beidouSatelliteEphemerisTimeClass, "getAode", "()I");
726     method_beidouSatelliteEphemerisTimeGetBeidouWeekNumber =
727             env->GetMethodID(beidouSatelliteEphemerisTimeClass, "getBeidouWeekNumber", "()I");
728     method_beidouSatelliteEphemerisTimeGetToeSeconds =
729             env->GetMethodID(beidouSatelliteEphemerisTimeClass, "getToeSeconds", "()I");
730 
731     // Get the methods of GalileoAssistance class.
732     jclass galileoAssistanceClass = env->FindClass("android/location/GalileoAssistance");
733     method_galileoAssistanceGetAlmanac = env->GetMethodID(galileoAssistanceClass, "getAlmanac",
734                                                           "()Landroid/location/GnssAlmanac;");
735     method_galileoAssistanceGetIonosphericModel =
736             env->GetMethodID(galileoAssistanceClass, "getIonosphericModel",
737                              "()Landroid/location/GalileoIonosphericModel;");
738     method_galileoAssistanceGetUtcModel = env->GetMethodID(galileoAssistanceClass, "getUtcModel",
739                                                            "()Landroid/location/UtcModel;");
740     method_galileoAssistanceGetLeapSecondsModel =
741             env->GetMethodID(galileoAssistanceClass, "getLeapSecondsModel",
742                              "()Landroid/location/LeapSecondsModel;");
743     method_galileoAssistanceGetTimeModels =
744             env->GetMethodID(galileoAssistanceClass, "getTimeModels", "()Ljava/util/List;");
745     method_galileoAssistanceGetSatelliteEphemeris =
746             env->GetMethodID(galileoAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;");
747     method_galileoAssistanceGetSatelliteCorrections =
748             env->GetMethodID(galileoAssistanceClass, "getSatelliteCorrections",
749                              "()Ljava/util/List;");
750     method_galileoAssistanceGetRealTimeIntegrityModels =
751             env->GetMethodID(galileoAssistanceClass, "getRealTimeIntegrityModels",
752                              "()Ljava/util/List;");
753     method_galileoAssistanceGetAuxiliaryInformation =
754             env->GetMethodID(galileoAssistanceClass, "getAuxiliaryInformation",
755                              "()Ljava/util/List;");
756 
757     // Get the methods of GalileoSatelliteEphemeris class
758     jclass galileoSatelliteEphemerisClass =
759             env->FindClass("android/location/GalileoSatelliteEphemeris");
760     method_galileoSatelliteEphemerisGetSatelliteClockModels =
761             env->GetMethodID(galileoSatelliteEphemerisClass, "getSatelliteClockModels",
762                              "()Ljava/util/List;");
763     method_galileoSatelliteEphemerisGetSvid =
764             env->GetMethodID(galileoSatelliteEphemerisClass, "getSvid", "()I");
765     method_galileoSatelliteEphemerisGetSatelliteEphemerisTime =
766             env->GetMethodID(galileoSatelliteEphemerisClass, "getSatelliteEphemerisTime",
767                              "()Landroid/location/SatelliteEphemerisTime;");
768     method_galileoSatelliteEphemerisGetSatelliteHealth =
769             env->GetMethodID(galileoSatelliteEphemerisClass, "getSatelliteHealth",
770                              "()Landroid/location/GalileoSatelliteEphemeris$GalileoSvHealth;");
771     method_galileoSatelliteEphemerisGetSatelliteOrbitModel =
772             env->GetMethodID(galileoSatelliteEphemerisClass, "getSatelliteOrbitModel",
773                              "()Landroid/location/KeplerianOrbitModel;");
774 
775     // Get the methods of GalileoSatelliteClockModel class.
776     jclass galileoSatelliteClockModelClass =
777             env->FindClass("android/location/GalileoSatelliteEphemeris$GalileoSatelliteClockModel");
778     method_galileoSatelliteClockModelGetAf0 =
779             env->GetMethodID(galileoSatelliteClockModelClass, "getAf0", "()D");
780     method_galileoSatelliteClockModelGetAf1 =
781             env->GetMethodID(galileoSatelliteClockModelClass, "getAf1", "()D");
782     method_galileoSatelliteClockModelGetAf2 =
783             env->GetMethodID(galileoSatelliteClockModelClass, "getAf2", "()D");
784     method_galileoSatelliteClockModelGetBgdSeconds =
785             env->GetMethodID(galileoSatelliteClockModelClass, "getBgdSeconds", "()D");
786     method_galileoSatelliteClockModelGetSatelliteClockType =
787             env->GetMethodID(galileoSatelliteClockModelClass, "getSatelliteClockType", "()I");
788     method_galileoSatelliteClockModelGetSisaMeters =
789             env->GetMethodID(galileoSatelliteClockModelClass, "getSisaMeters", "()D");
790     method_galileoSatelliteClockModelGetTimeOfClockSeconds =
791             env->GetMethodID(galileoSatelliteClockModelClass, "getTimeOfClockSeconds", "()J");
792 
793     // Get the methods of GalileoSvHealth class.
794     jclass galileoSvHealthClass =
795             env->FindClass("android/location/GalileoSatelliteEphemeris$GalileoSvHealth");
796     method_galileoSvHealthGetDataValidityStatusE1b =
797             env->GetMethodID(galileoSvHealthClass, "getDataValidityStatusE1b", "()I");
798     method_galileoSvHealthGetDataValidityStatusE5a =
799             env->GetMethodID(galileoSvHealthClass, "getDataValidityStatusE5a", "()I");
800     method_galileoSvHealthGetDataValidityStatusE5b =
801             env->GetMethodID(galileoSvHealthClass, "getDataValidityStatusE5b", "()I");
802     method_galileoSvHealthGetSignalHealthStatusE1b =
803             env->GetMethodID(galileoSvHealthClass, "getSignalHealthStatusE1b", "()I");
804     method_galileoSvHealthGetSignalHealthStatusE5a =
805             env->GetMethodID(galileoSvHealthClass, "getSignalHealthStatusE5a", "()I");
806     method_galileoSvHealthGetSignalHealthStatusE5b =
807             env->GetMethodID(galileoSvHealthClass, "getSignalHealthStatusE5b", "()I");
808 
809     // Get the methods of GalileoIonosphericModel class.
810     jclass galileoIonosphericModelClass =
811             env->FindClass("android/location/GalileoIonosphericModel");
812     method_galileoIonosphericModelGetAi0 =
813             env->GetMethodID(galileoIonosphericModelClass, "getAi0", "()D");
814     method_galileoIonosphericModelGetAi1 =
815             env->GetMethodID(galileoIonosphericModelClass, "getAi1", "()D");
816     method_galileoIonosphericModelGetAi2 =
817             env->GetMethodID(galileoIonosphericModelClass, "getAi2", "()D");
818 
819     // Get the methods of GlonassAssistance class.
820     jclass glonassAssistanceClass = env->FindClass("android/location/GlonassAssistance");
821     method_glonassAssistanceGetAlmanac = env->GetMethodID(glonassAssistanceClass, "getAlmanac",
822                                                           "()Landroid/location/GlonassAlmanac;");
823     method_glonassAssistanceGetUtcModel = env->GetMethodID(glonassAssistanceClass, "getUtcModel",
824                                                            "()Landroid/location/UtcModel;");
825     method_glonassAssistanceGetTimeModels =
826             env->GetMethodID(glonassAssistanceClass, "getTimeModels", "()Ljava/util/List;");
827     method_glonassAssistanceGetSatelliteEphemeris =
828             env->GetMethodID(glonassAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;");
829     method_glonassAssistanceGetSatelliteCorrections =
830             env->GetMethodID(glonassAssistanceClass, "getSatelliteCorrections",
831                              "()Ljava/util/List;");
832     method_glonassAssistanceGetRealTimeIntegrityModels =
833             env->GetMethodID(glonassAssistanceClass, "getRealTimeIntegrityModels",
834                              "()Ljava/util/List;");
835     method_glonassAssistanceGetAuxiliaryInformation =
836             env->GetMethodID(glonassAssistanceClass, "getAuxiliaryInformation",
837                              "()Ljava/util/List;");
838 
839     // Get the methods of GlonassAlmanac class.
840     jclass glonassAlmanacClass = env->FindClass("android/location/GlonassAlmanac");
841     method_glonassAlmanacGetIssueDateMillis =
842             env->GetMethodID(glonassAlmanacClass, "getIssueDateMillis", "()J");
843     method_glonassAlmanacGetSatelliteAlmanacs =
844             env->GetMethodID(glonassAlmanacClass, "getSatelliteAlmanacs", "()Ljava/util/List;");
845 
846     // Get the methods of GlonassSatelliteAlmanac class
847     jclass glonassSatelliteAlmanacClass =
848             env->FindClass("android/location/GlonassAlmanac$GlonassSatelliteAlmanac");
849     method_glonassSatelliteAlmanacGetDeltaI =
850             env->GetMethodID(glonassSatelliteAlmanacClass, "getDeltaI", "()D");
851     method_glonassSatelliteAlmanacGetDeltaT =
852             env->GetMethodID(glonassSatelliteAlmanacClass, "getDeltaT", "()D");
853     method_glonassSatelliteAlmanacGetDeltaTDot =
854             env->GetMethodID(glonassSatelliteAlmanacClass, "getDeltaTDot", "()D");
855     method_glonassSatelliteAlmanacGetEccentricity =
856             env->GetMethodID(glonassSatelliteAlmanacClass, "getEccentricity", "()D");
857     method_glonassSatelliteAlmanacGetFrequencyChannelNumber =
858             env->GetMethodID(glonassSatelliteAlmanacClass, "getFrequencyChannelNumber", "()I");
859     method_glonassSatelliteAlmanacGetLambda =
860             env->GetMethodID(glonassSatelliteAlmanacClass, "getLambda", "()D");
861     method_glonassSatelliteAlmanacGetOmega =
862             env->GetMethodID(glonassSatelliteAlmanacClass, "getOmega", "()D");
863     method_glonassSatelliteAlmanacGetSlotNumber =
864             env->GetMethodID(glonassSatelliteAlmanacClass, "getSlotNumber", "()I");
865     method_glonassSatelliteAlmanacGetHealthState =
866             env->GetMethodID(glonassSatelliteAlmanacClass, "getHealthState", "()I");
867     method_glonassSatelliteAlmanacGetTLambda =
868             env->GetMethodID(glonassSatelliteAlmanacClass, "getTLambda", "()D");
869     method_glonassSatelliteAlmanacGetTau =
870             env->GetMethodID(glonassSatelliteAlmanacClass, "getTau", "()D");
871     method_glonassSatelliteAlmanacGetCalendarDayNumber =
872             env->GetMethodID(glonassSatelliteAlmanacClass, "getCalendarDayNumber", "()I");
873     method_glonassSatelliteAlmanacGetIsGlonassM =
874             env->GetMethodID(glonassSatelliteAlmanacClass, "isGlonassM", "()Z");
875 
876     // Get the methods of GlonassSatelliteEphemeris
877     jclass glonassSatelliteEphemerisClass =
878             env->FindClass("android/location/GlonassSatelliteEphemeris");
879     method_glonassSatelliteEphemerisGetAgeInDays =
880             env->GetMethodID(glonassSatelliteEphemerisClass, "getAgeInDays", "()I");
881     method_glonassSatelliteEphemerisGetFrameTimeSeconds =
882             env->GetMethodID(glonassSatelliteEphemerisClass, "getFrameTimeSeconds", "()D");
883     method_glonassSatelliteEphemerisGetHealthState =
884             env->GetMethodID(glonassSatelliteEphemerisClass, "getHealthState", "()I");
885     method_glonassSatelliteEphemerisGetSlotNumber =
886             env->GetMethodID(glonassSatelliteEphemerisClass, "getSlotNumber", "()I");
887     method_glonassSatelliteEphemerisGetSatelliteClockModel =
888             env->GetMethodID(glonassSatelliteEphemerisClass, "getSatelliteClockModel",
889                              "()Landroid/location/"
890                              "GlonassSatelliteEphemeris$GlonassSatelliteClockModel;");
891     method_glonassSatelliteEphemerisGetSatelliteOrbitModel =
892             env->GetMethodID(glonassSatelliteEphemerisClass, "getSatelliteOrbitModel",
893                              "()Landroid/location/"
894                              "GlonassSatelliteEphemeris$GlonassSatelliteOrbitModel;");
895     method_glonassSatelliteEphemerisGetUpdateIntervalMinutes =
896             env->GetMethodID(glonassSatelliteEphemerisClass, "getUpdateIntervalMinutes", "()I");
897     method_glonassSatelliteEphemerisGetIsGlonassM =
898             env->GetMethodID(glonassSatelliteEphemerisClass, "isGlonassM", "()Z");
899     method_glonassSatelliteEphemerisGetIsUpdateIntervalOdd =
900             env->GetMethodID(glonassSatelliteEphemerisClass, "isUpdateIntervalOdd", "()Z");
901 
902     // Get the methods of GlonassSatelliteOrbitModel
903     jclass glonassSatelliteOrbitModelClass =
904             env->FindClass("android/location/GlonassSatelliteEphemeris$GlonassSatelliteOrbitModel");
905     method_glonassSatelliteOrbitModelGetX =
906             env->GetMethodID(glonassSatelliteOrbitModelClass, "getX", "()D");
907     method_glonassSatelliteOrbitModelGetXAccel =
908             env->GetMethodID(glonassSatelliteOrbitModelClass, "getXAccel", "()D");
909     method_glonassSatelliteOrbitModelGetXDot =
910             env->GetMethodID(glonassSatelliteOrbitModelClass, "getXDot", "()D");
911     method_glonassSatelliteOrbitModelGetY =
912             env->GetMethodID(glonassSatelliteOrbitModelClass, "getY", "()D");
913     method_glonassSatelliteOrbitModelGetYAccel =
914             env->GetMethodID(glonassSatelliteOrbitModelClass, "getYAccel", "()D");
915     method_glonassSatelliteOrbitModelGetYDot =
916             env->GetMethodID(glonassSatelliteOrbitModelClass, "getYDot", "()D");
917     method_glonassSatelliteOrbitModelGetZ =
918             env->GetMethodID(glonassSatelliteOrbitModelClass, "getZ", "()D");
919     method_glonassSatelliteOrbitModelGetZAccel =
920             env->GetMethodID(glonassSatelliteOrbitModelClass, "getZAccel", "()D");
921     method_glonassSatelliteOrbitModelGetZDot =
922             env->GetMethodID(glonassSatelliteOrbitModelClass, "getZDot", "()D");
923 
924     // Get the methods of GlonassSatelliteClockModel
925     jclass glonassSatelliteClockModelClass =
926             env->FindClass("android/location/GlonassSatelliteEphemeris$GlonassSatelliteClockModel");
927     method_glonassSatelliteClockModelGetClockBias =
928             env->GetMethodID(glonassSatelliteClockModelClass, "getClockBias", "()D");
929     method_glonassSatelliteClockModelGetFrequencyBias =
930             env->GetMethodID(glonassSatelliteClockModelClass, "getFrequencyBias", "()D");
931     method_glonassSatelliteClockModelGetFrequencyChannelNumber =
932             env->GetMethodID(glonassSatelliteClockModelClass, "getFrequencyChannelNumber", "()I");
933     method_glonassSatelliteClockModelGetTimeOfClockSeconds =
934             env->GetMethodID(glonassSatelliteClockModelClass, "getTimeOfClockSeconds", "()J");
935 
936     // Get the methods of QzssAssistance class.
937     jclass qzssAssistanceClass = env->FindClass("android/location/QzssAssistance");
938     method_qzssAssistanceGetAlmanac =
939             env->GetMethodID(qzssAssistanceClass, "getAlmanac", "()Landroid/location/GnssAlmanac;");
940     method_qzssAssistanceGetIonosphericModel =
941             env->GetMethodID(qzssAssistanceClass, "getIonosphericModel",
942                              "()Landroid/location/KlobucharIonosphericModel;");
943     method_qzssAssistanceGetUtcModel =
944             env->GetMethodID(qzssAssistanceClass, "getUtcModel", "()Landroid/location/UtcModel;");
945     method_qzssAssistanceGetLeapSecondsModel =
946             env->GetMethodID(qzssAssistanceClass, "getLeapSecondsModel",
947                              "()Landroid/location/LeapSecondsModel;");
948     method_qzssAssistanceGetTimeModels =
949             env->GetMethodID(qzssAssistanceClass, "getTimeModels", "()Ljava/util/List;");
950     method_qzssAssistanceGetSatelliteEphemeris =
951             env->GetMethodID(qzssAssistanceClass, "getSatelliteEphemeris", "()Ljava/util/List;");
952     method_qzssAssistanceGetSatelliteCorrections =
953             env->GetMethodID(qzssAssistanceClass, "getSatelliteCorrections", "()Ljava/util/List;");
954     method_qzssAssistanceGetAuxiliaryInformation =
955             env->GetMethodID(qzssAssistanceClass, "getAuxiliaryInformation", "()Ljava/util/List;");
956 
957     // Get the methods of QzssSatelliteEphemeris class.
958     jclass qzssSatelliteEphemerisClass = env->FindClass("android/location/QzssSatelliteEphemeris");
959     method_qzssSatelliteEphemerisGetSvid =
960             env->GetMethodID(qzssSatelliteEphemerisClass, "getSvid", "()I");
961     method_qzssSatelliteEphemerisGetGpsL2Params =
962             env->GetMethodID(qzssSatelliteEphemerisClass, "getGpsL2Params",
963                              "()Landroid/location/GpsSatelliteEphemeris$GpsL2Params;");
964     method_qzssSatelliteEphemerisGetSatelliteEphemerisTime =
965             env->GetMethodID(qzssSatelliteEphemerisClass, "getSatelliteEphemerisTime",
966                              "()Landroid/location/SatelliteEphemerisTime;");
967     method_qzssSatelliteEphemerisGetSatelliteHealth =
968             env->GetMethodID(qzssSatelliteEphemerisClass, "getSatelliteHealth",
969                              "()Landroid/location/GpsSatelliteEphemeris$GpsSatelliteHealth;");
970     method_qzssSatelliteEphemerisGetSatelliteOrbitModel =
971             env->GetMethodID(qzssSatelliteEphemerisClass, "getSatelliteOrbitModel",
972                              "()Landroid/location/KeplerianOrbitModel;");
973 }
974 
GnssAssistanceInterface(const sp<IGnssAssistanceInterface> & iGnssAssistance)975 GnssAssistanceInterface::GnssAssistanceInterface(
976         const sp<IGnssAssistanceInterface>& iGnssAssistance)
977       : mGnssAssistanceInterface(iGnssAssistance) {
978     assert(mGnssAssistanceInterface != nullptr);
979 }
980 
injectGnssAssistance(JNIEnv * env,jobject gnssAssistanceObj)981 jboolean GnssAssistanceInterface::injectGnssAssistance(JNIEnv* env, jobject gnssAssistanceObj) {
982     GnssAssistance gnssAssistance;
983     GnssAssistanceUtil::setGnssAssistance(env, gnssAssistanceObj, gnssAssistance);
984     auto status = mGnssAssistanceInterface->injectGnssAssistance(gnssAssistance);
985     return checkAidlStatus(status, "IGnssAssistanceInterface injectGnssAssistance() failed.");
986 }
987 
setCallback(const sp<IGnssAssistanceCallback> & callback)988 jboolean GnssAssistanceInterface::setCallback(const sp<IGnssAssistanceCallback>& callback) {
989     auto status = mGnssAssistanceInterface->setCallback(callback);
990     return checkAidlStatus(status, "IGnssAssistanceInterface setCallback() failed.");
991 }
992 
setGnssAssistance(JNIEnv * env,jobject gnssAssistanceObj,GnssAssistance & gnssAssistance)993 void GnssAssistanceUtil::setGnssAssistance(JNIEnv* env, jobject gnssAssistanceObj,
994                                            GnssAssistance& gnssAssistance) {
995     jobject gpsAssistanceObj =
996             env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetGpsAssistance);
997     jobject glonassAssistanceObj =
998             env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetGlonassAssistance);
999     jobject qzssAssistanceObj =
1000             env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetQzssAssistance);
1001     jobject galileoAssistanceObj =
1002             env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetGalileoAssistance);
1003     jobject beidouAssistanceObj =
1004             env->CallObjectMethod(gnssAssistanceObj, method_gnssAssistanceGetBeidouAssistance);
1005 
1006     GnssAssistanceUtil::setGpsAssistance(env, gpsAssistanceObj, gnssAssistance.gpsAssistance);
1007     GnssAssistanceUtil::setGlonassAssistance(env, glonassAssistanceObj,
1008                                              gnssAssistance.glonassAssistance);
1009     GnssAssistanceUtil::setQzssAssistance(env, qzssAssistanceObj, gnssAssistance.qzssAssistance);
1010     GnssAssistanceUtil::setGalileoAssistance(env, galileoAssistanceObj,
1011                                              gnssAssistance.galileoAssistance);
1012     GnssAssistanceUtil::setBeidouAssistance(env, beidouAssistanceObj,
1013                                             gnssAssistance.beidouAssistance);
1014     env->DeleteLocalRef(gpsAssistanceObj);
1015     env->DeleteLocalRef(glonassAssistanceObj);
1016     env->DeleteLocalRef(qzssAssistanceObj);
1017     env->DeleteLocalRef(galileoAssistanceObj);
1018     env->DeleteLocalRef(beidouAssistanceObj);
1019 }
1020 
setQzssAssistance(JNIEnv * env,jobject qzssAssistanceObj,std::optional<QzssAssistance> & qzssAssistanceOpt)1021 void GnssAssistanceUtil::setQzssAssistance(JNIEnv* env, jobject qzssAssistanceObj,
1022                                            std::optional<QzssAssistance>& qzssAssistanceOpt) {
1023     QzssAssistance qzssAssistance;
1024     jobject qzssAlmanacObj =
1025             env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetAlmanac);
1026     jobject qzssIonosphericModelObj =
1027             env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetIonosphericModel);
1028     jobject qzssUtcModelObj =
1029             env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetUtcModel);
1030     jobject qzssLeapSecondsModelObj =
1031             env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetLeapSecondsModel);
1032     jobject qzssTimeModelsObj =
1033             env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetTimeModels);
1034     jobject qzssSatelliteEphemerisObj =
1035             env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetSatelliteEphemeris);
1036     jobject qzssSatelliteCorrectionsObj =
1037             env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetSatelliteCorrections);
1038     jobject qzssAuxiliaryInformationObj =
1039             env->CallObjectMethod(qzssAssistanceObj, method_qzssAssistanceGetAuxiliaryInformation);
1040     setGnssAlmanac(env, qzssAlmanacObj, qzssAssistance.almanac);
1041     setKlobucharIonosphericModel(env, qzssIonosphericModelObj, qzssAssistance.ionosphericModel);
1042     setUtcModel(env, qzssUtcModelObj, qzssAssistance.utcModel);
1043     setLeapSecondsModel(env, qzssLeapSecondsModelObj, qzssAssistance.leapSecondsModel);
1044     setTimeModels(env, qzssTimeModelsObj, qzssAssistance.timeModels);
1045     setGpsOrQzssSatelliteEphemeris<QzssSatelliteEphemeris>(env, qzssSatelliteEphemerisObj,
1046                                                            qzssAssistance.satelliteEphemeris);
1047     setSatelliteCorrections(env, qzssSatelliteCorrectionsObj, qzssAssistance.satelliteCorrections);
1048     setAuxiliaryInformations(env, qzssAuxiliaryInformationObj,
1049                              qzssAssistance.auxiliaryInformations);
1050     qzssAssistanceOpt = qzssAssistance;
1051     env->DeleteLocalRef(qzssAlmanacObj);
1052     env->DeleteLocalRef(qzssIonosphericModelObj);
1053     env->DeleteLocalRef(qzssUtcModelObj);
1054     env->DeleteLocalRef(qzssLeapSecondsModelObj);
1055     env->DeleteLocalRef(qzssTimeModelsObj);
1056     env->DeleteLocalRef(qzssSatelliteEphemerisObj);
1057     env->DeleteLocalRef(qzssSatelliteCorrectionsObj);
1058     env->DeleteLocalRef(qzssAuxiliaryInformationObj);
1059 }
1060 
setGlonassAssistance(JNIEnv * env,jobject glonassAssistanceObj,std::optional<GlonassAssistance> & glonassAssistanceOpt)1061 void GnssAssistanceUtil::setGlonassAssistance(
1062         JNIEnv* env, jobject glonassAssistanceObj,
1063         std::optional<GlonassAssistance>& glonassAssistanceOpt) {
1064     GlonassAssistance glonassAssistance;
1065     jobject glonassAlmanacObj =
1066             env->CallObjectMethod(glonassAssistanceObj, method_glonassAssistanceGetAlmanac);
1067     jobject utcModelObj =
1068             env->CallObjectMethod(glonassAssistanceObj, method_glonassAssistanceGetUtcModel);
1069     jobject timeModelsObj =
1070             env->CallObjectMethod(glonassAssistanceObj, method_glonassAssistanceGetTimeModels);
1071     jobject satelliteEphemerisObj =
1072             env->CallObjectMethod(glonassAssistanceObj,
1073                                   method_glonassAssistanceGetSatelliteEphemeris);
1074     jobject satelliteCorrectionsObj =
1075             env->CallObjectMethod(glonassAssistanceObj,
1076                                   method_glonassAssistanceGetSatelliteCorrections);
1077     jobject realTimeIntegrityModelsObj =
1078             env->CallObjectMethod(glonassAssistanceObj,
1079                                   method_glonassAssistanceGetRealTimeIntegrityModels);
1080     jobject auxiliaryInformationObj =
1081             env->CallObjectMethod(glonassAssistanceObj,
1082                                   method_glonassAssistanceGetAuxiliaryInformation);
1083     setGlonassAlmanac(env, glonassAlmanacObj, glonassAssistance.almanac);
1084     setUtcModel(env, utcModelObj, glonassAssistance.utcModel);
1085     setTimeModels(env, timeModelsObj, glonassAssistance.timeModels);
1086     setGlonassSatelliteEphemeris(env, satelliteEphemerisObj, glonassAssistance.satelliteEphemeris);
1087     setSatelliteCorrections(env, satelliteCorrectionsObj, glonassAssistance.satelliteCorrections);
1088     setRealTimeIntegrityModels(env, realTimeIntegrityModelsObj,
1089                                glonassAssistance.realTimeIntegrityModels);
1090     setAuxiliaryInformations(env, auxiliaryInformationObj, glonassAssistance.auxiliaryInformations);
1091     glonassAssistanceOpt = glonassAssistance;
1092     env->DeleteLocalRef(glonassAlmanacObj);
1093     env->DeleteLocalRef(utcModelObj);
1094     env->DeleteLocalRef(timeModelsObj);
1095     env->DeleteLocalRef(satelliteEphemerisObj);
1096     env->DeleteLocalRef(satelliteCorrectionsObj);
1097     env->DeleteLocalRef(realTimeIntegrityModelsObj);
1098     env->DeleteLocalRef(auxiliaryInformationObj);
1099 }
1100 
setGlonassAlmanac(JNIEnv * env,jobject glonassAlmanacObj,std::optional<GlonassAlmanac> & glonassAlmanacOpt)1101 void GnssAssistanceUtil::setGlonassAlmanac(JNIEnv* env, jobject glonassAlmanacObj,
1102                                            std::optional<GlonassAlmanac>& glonassAlmanacOpt) {
1103     if (glonassAlmanacObj == nullptr) return;
1104     GlonassAlmanac glonassAlmanac;
1105     jlong issueDateMillis =
1106             env->CallLongMethod(glonassAlmanacObj, method_glonassAlmanacGetIssueDateMillis);
1107     glonassAlmanac.issueDateMs = issueDateMillis;
1108     jobject satelliteAlmanacsObj =
1109             env->CallObjectMethod(glonassAlmanacObj, method_glonassAlmanacGetSatelliteAlmanacs);
1110     if (satelliteAlmanacsObj == nullptr) return;
1111     auto len = env->CallIntMethod(satelliteAlmanacsObj, method_listSize);
1112     for (uint16_t i = 0; i < len; ++i) {
1113         jobject glonassSatelliteAlmanacObj =
1114                 env->CallObjectMethod(satelliteAlmanacsObj, method_listGet, i);
1115         if (glonassSatelliteAlmanacObj == nullptr) continue;
1116         GlonassSatelliteAlmanac glonassSatelliteAlmanac;
1117         jdouble deltaI = env->CallDoubleMethod(glonassSatelliteAlmanacObj,
1118                                                method_glonassSatelliteAlmanacGetDeltaI);
1119         glonassSatelliteAlmanac.deltaI = deltaI;
1120         jdouble deltaT = env->CallDoubleMethod(glonassSatelliteAlmanacObj,
1121                                                method_glonassSatelliteAlmanacGetDeltaT);
1122         glonassSatelliteAlmanac.deltaT = deltaT;
1123         jdouble deltaTDot = env->CallDoubleMethod(glonassSatelliteAlmanacObj,
1124                                                   method_glonassSatelliteAlmanacGetDeltaTDot);
1125         glonassSatelliteAlmanac.deltaTDot = deltaTDot;
1126         jdouble eccentricity = env->CallDoubleMethod(glonassSatelliteAlmanacObj,
1127                                                      method_glonassSatelliteAlmanacGetEccentricity);
1128         glonassSatelliteAlmanac.eccentricity = eccentricity;
1129         jint frequencyChannelNumber =
1130                 env->CallIntMethod(glonassSatelliteAlmanacObj,
1131                                    method_glonassSatelliteAlmanacGetFrequencyChannelNumber);
1132         glonassSatelliteAlmanac.frequencyChannelNumber =
1133                 static_cast<int32_t>(frequencyChannelNumber);
1134         jdouble lambda = env->CallDoubleMethod(glonassSatelliteAlmanacObj,
1135                                                method_glonassSatelliteAlmanacGetLambda);
1136         glonassSatelliteAlmanac.lambda = lambda;
1137         jdouble omega = env->CallDoubleMethod(glonassSatelliteAlmanacObj,
1138                                               method_glonassSatelliteAlmanacGetOmega);
1139         glonassSatelliteAlmanac.omega = omega;
1140         jint slotNumber = env->CallIntMethod(glonassSatelliteAlmanacObj,
1141                                              method_glonassSatelliteAlmanacGetSlotNumber);
1142         glonassSatelliteAlmanac.slotNumber = static_cast<int32_t>(slotNumber);
1143         jint healthState = env->CallIntMethod(glonassSatelliteAlmanacObj,
1144                                               method_glonassSatelliteAlmanacGetHealthState);
1145         glonassSatelliteAlmanac.svHealth = static_cast<int32_t>(healthState);
1146         jdouble tLambda = env->CallDoubleMethod(glonassSatelliteAlmanacObj,
1147                                                 method_glonassSatelliteAlmanacGetTLambda);
1148         glonassSatelliteAlmanac.tLambda = tLambda;
1149         jdouble tau = env->CallDoubleMethod(glonassSatelliteAlmanacObj,
1150                                             method_glonassSatelliteAlmanacGetTau);
1151         glonassSatelliteAlmanac.tau = tau;
1152         jboolean isGlonassM = env->CallBooleanMethod(glonassSatelliteAlmanacObj,
1153                                                      method_glonassSatelliteAlmanacGetIsGlonassM);
1154         glonassSatelliteAlmanac.isGlonassM = isGlonassM;
1155         jint calendarDayNumber =
1156                 env->CallIntMethod(glonassSatelliteAlmanacObj,
1157                                    method_glonassSatelliteAlmanacGetCalendarDayNumber);
1158         glonassSatelliteAlmanac.calendarDayNumber = static_cast<int32_t>(calendarDayNumber);
1159         env->DeleteLocalRef(glonassSatelliteAlmanacObj);
1160         glonassAlmanac.satelliteAlmanacs.push_back(glonassSatelliteAlmanac);
1161         glonassAlmanacOpt = glonassAlmanac;
1162     }
1163     env->DeleteLocalRef(satelliteAlmanacsObj);
1164 }
1165 
setGlonassSatelliteEphemeris(JNIEnv * env,jobject glonassSatelliteEphemerisListObj,std::vector<GlonassSatelliteEphemeris> & glonassSatelliteEphemerisList)1166 void GnssAssistanceUtil::setGlonassSatelliteEphemeris(
1167         JNIEnv* env, jobject glonassSatelliteEphemerisListObj,
1168         std::vector<GlonassSatelliteEphemeris>& glonassSatelliteEphemerisList) {
1169     if (glonassSatelliteEphemerisListObj == nullptr) return;
1170     auto len = env->CallIntMethod(glonassSatelliteEphemerisListObj, method_listSize);
1171     for (uint16_t i = 0; i < len; ++i) {
1172         jobject glonassSatelliteEphemerisObj =
1173                 env->CallObjectMethod(glonassSatelliteEphemerisListObj, method_listGet, i);
1174         if (glonassSatelliteEphemerisObj == nullptr) continue;
1175         GlonassSatelliteEphemeris glonassSatelliteEphemeris;
1176         jdouble ageInDays = env->CallDoubleMethod(glonassSatelliteEphemerisObj,
1177                                                   method_glonassSatelliteEphemerisGetAgeInDays);
1178         glonassSatelliteEphemeris.ageInDays = ageInDays;
1179 
1180         // Set the GlonassSatelliteClockModel.
1181         jobject glonassSatelliteClockModelObj =
1182                 env->CallObjectMethod(glonassSatelliteEphemerisObj,
1183                                       method_glonassSatelliteEphemerisGetSatelliteClockModel);
1184         GlonassSatelliteClockModel glonassSatelliteClockModel;
1185         jdouble clockBias = env->CallDoubleMethod(glonassSatelliteClockModelObj,
1186                                                   method_glonassSatelliteClockModelGetClockBias);
1187         glonassSatelliteClockModel.clockBias = clockBias;
1188         jdouble frequencyBias =
1189                 env->CallDoubleMethod(glonassSatelliteClockModelObj,
1190                                       method_glonassSatelliteClockModelGetFrequencyBias);
1191         glonassSatelliteClockModel.frequencyBias = frequencyBias;
1192         jint frequencyChannelNumber =
1193                 env->CallIntMethod(glonassSatelliteClockModelObj,
1194                                    method_glonassSatelliteClockModelGetFrequencyChannelNumber);
1195         glonassSatelliteClockModel.frequencyChannelNumber =
1196                 static_cast<int32_t>(frequencyChannelNumber);
1197         jdouble timeOfClockSeconds =
1198                 env->CallDoubleMethod(glonassSatelliteClockModelObj,
1199                                       method_glonassSatelliteClockModelGetTimeOfClockSeconds);
1200         glonassSatelliteClockModel.timeOfClockSeconds = timeOfClockSeconds;
1201         glonassSatelliteEphemeris.satelliteClockModel = glonassSatelliteClockModel;
1202         env->DeleteLocalRef(glonassSatelliteClockModelObj);
1203 
1204         // Set the GlonassSatelliteOrbitModel.
1205         jobject glonassSatelliteOrbitModelObj =
1206                 env->CallObjectMethod(glonassSatelliteEphemerisObj,
1207                                       method_glonassSatelliteEphemerisGetSatelliteOrbitModel);
1208         GlonassSatelliteOrbitModel glonassSatelliteOrbitModel;
1209         jdouble x = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1210                                           method_glonassSatelliteOrbitModelGetX);
1211         glonassSatelliteOrbitModel.x = x;
1212         jdouble y = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1213                                           method_glonassSatelliteOrbitModelGetY);
1214         glonassSatelliteOrbitModel.y = y;
1215         jdouble z = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1216                                           method_glonassSatelliteOrbitModelGetZ);
1217         glonassSatelliteOrbitModel.z = z;
1218         jdouble xAccel = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1219                                                method_glonassSatelliteOrbitModelGetXAccel);
1220         glonassSatelliteOrbitModel.xAccel = xAccel;
1221         jdouble yAccel = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1222                                                method_glonassSatelliteOrbitModelGetYAccel);
1223         glonassSatelliteOrbitModel.yAccel = yAccel;
1224         jdouble zAccel = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1225                                                method_glonassSatelliteOrbitModelGetZAccel);
1226         glonassSatelliteOrbitModel.zAccel = zAccel;
1227         jdouble xDot = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1228                                              method_glonassSatelliteOrbitModelGetXDot);
1229         glonassSatelliteOrbitModel.xDot = xDot;
1230         jdouble yDot = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1231                                              method_glonassSatelliteOrbitModelGetYDot);
1232         glonassSatelliteOrbitModel.yDot = yDot;
1233         jdouble zDot = env->CallDoubleMethod(glonassSatelliteOrbitModelObj,
1234                                              method_glonassSatelliteOrbitModelGetZDot);
1235         glonassSatelliteOrbitModel.zDot = zDot;
1236         glonassSatelliteEphemeris.satelliteOrbitModel = glonassSatelliteOrbitModel;
1237         env->DeleteLocalRef(glonassSatelliteOrbitModelObj);
1238 
1239         jint healthState = env->CallIntMethod(glonassSatelliteEphemerisObj,
1240                                               method_glonassSatelliteEphemerisGetHealthState);
1241         glonassSatelliteEphemeris.svHealth = static_cast<int32_t>(healthState);
1242         jint slotNumber = env->CallIntMethod(glonassSatelliteEphemerisObj,
1243                                              method_glonassSatelliteEphemerisGetSlotNumber);
1244         glonassSatelliteEphemeris.slotNumber = static_cast<int32_t>(slotNumber);
1245         jdouble frameTimeSeconds =
1246                 env->CallDoubleMethod(glonassSatelliteEphemerisObj,
1247                                       method_glonassSatelliteEphemerisGetFrameTimeSeconds);
1248         glonassSatelliteEphemeris.frameTimeSeconds = frameTimeSeconds;
1249         jint updateIntervalMinutes =
1250                 env->CallIntMethod(glonassSatelliteEphemerisObj,
1251                                    method_glonassSatelliteEphemerisGetUpdateIntervalMinutes);
1252         glonassSatelliteEphemeris.updateIntervalMinutes =
1253                 static_cast<int32_t>(updateIntervalMinutes);
1254         jboolean isGlonassM = env->CallBooleanMethod(glonassSatelliteEphemerisObj,
1255                                                      method_glonassSatelliteEphemerisGetIsGlonassM);
1256         glonassSatelliteEphemeris.isGlonassM = isGlonassM;
1257         jboolean isUpdateIntervalOdd =
1258                 env->CallBooleanMethod(glonassSatelliteEphemerisObj,
1259                                        method_glonassSatelliteEphemerisGetIsUpdateIntervalOdd);
1260         glonassSatelliteEphemeris.isOddUpdateInterval = isUpdateIntervalOdd;
1261         glonassSatelliteEphemerisList.push_back(glonassSatelliteEphemeris);
1262         env->DeleteLocalRef(glonassSatelliteEphemerisObj);
1263     }
1264 }
1265 
setGalileoAssistance(JNIEnv * env,jobject galileoAssistanceObj,std::optional<GalileoAssistance> & galileoAssistanceOpt)1266 void GnssAssistanceUtil::setGalileoAssistance(
1267         JNIEnv* env, jobject galileoAssistanceObj,
1268         std::optional<GalileoAssistance>& galileoAssistanceOpt) {
1269     GalileoAssistance galileoAssistance;
1270     jobject galileoAlmanacObj =
1271             env->CallObjectMethod(galileoAssistanceObj, method_galileoAssistanceGetAlmanac);
1272     jobject ionosphericModelObj =
1273             env->CallObjectMethod(galileoAssistanceObj,
1274                                   method_galileoAssistanceGetIonosphericModel);
1275     jobject utcModelObj =
1276             env->CallObjectMethod(galileoAssistanceObj, method_galileoAssistanceGetUtcModel);
1277     jobject leapSecondsModelObj =
1278             env->CallObjectMethod(galileoAssistanceObj,
1279                                   method_galileoAssistanceGetLeapSecondsModel);
1280     jobject timeModelsObj =
1281             env->CallObjectMethod(galileoAssistanceObj, method_galileoAssistanceGetTimeModels);
1282     jobject satelliteEphemerisObj =
1283             env->CallObjectMethod(galileoAssistanceObj,
1284                                   method_galileoAssistanceGetSatelliteEphemeris);
1285     jobject realTimeIntegrityModelsObj =
1286             env->CallObjectMethod(galileoAssistanceObj,
1287                                   method_galileoAssistanceGetRealTimeIntegrityModels);
1288     jobject satelliteCorrectionsObj =
1289             env->CallObjectMethod(galileoAssistanceObj,
1290                                   method_galileoAssistanceGetSatelliteCorrections);
1291     jobject auxiliaryInformationsObj =
1292             env->CallObjectMethod(galileoAssistanceObj,
1293                                   method_galileoAssistanceGetAuxiliaryInformation);
1294     setGnssAlmanac(env, galileoAlmanacObj, galileoAssistance.almanac);
1295     setGalileoIonosphericModel(env, ionosphericModelObj, galileoAssistance.ionosphericModel);
1296     setUtcModel(env, utcModelObj, galileoAssistance.utcModel);
1297     setLeapSecondsModel(env, leapSecondsModelObj, galileoAssistance.leapSecondsModel);
1298     setTimeModels(env, timeModelsObj, galileoAssistance.timeModels);
1299     setGalileoSatelliteEphemeris(env, satelliteEphemerisObj, galileoAssistance.satelliteEphemeris);
1300     setRealTimeIntegrityModels(env, realTimeIntegrityModelsObj,
1301                                galileoAssistance.realTimeIntegrityModels);
1302     setSatelliteCorrections(env, satelliteCorrectionsObj, galileoAssistance.satelliteCorrections);
1303     setAuxiliaryInformations(env, auxiliaryInformationsObj,
1304                              galileoAssistance.auxiliaryInformations);
1305     galileoAssistanceOpt = galileoAssistance;
1306     env->DeleteLocalRef(galileoAlmanacObj);
1307     env->DeleteLocalRef(ionosphericModelObj);
1308     env->DeleteLocalRef(utcModelObj);
1309     env->DeleteLocalRef(leapSecondsModelObj);
1310     env->DeleteLocalRef(timeModelsObj);
1311     env->DeleteLocalRef(satelliteEphemerisObj);
1312     env->DeleteLocalRef(realTimeIntegrityModelsObj);
1313     env->DeleteLocalRef(satelliteCorrectionsObj);
1314     env->DeleteLocalRef(auxiliaryInformationsObj);
1315 }
1316 
setGalileoIonosphericModel(JNIEnv * env,jobject galileoIonosphericModelObj,std::optional<GalileoIonosphericModel> & ionosphericModelOpt)1317 void GnssAssistanceUtil::setGalileoIonosphericModel(
1318         JNIEnv* env, jobject galileoIonosphericModelObj,
1319         std::optional<GalileoIonosphericModel>& ionosphericModelOpt) {
1320     if (galileoIonosphericModelObj == nullptr) return;
1321     GalileoIonosphericModel ionosphericModel;
1322     jdouble ai0 =
1323             env->CallDoubleMethod(galileoIonosphericModelObj, method_galileoIonosphericModelGetAi0);
1324     ionosphericModel.ai0 = ai0;
1325     jdouble ai1 =
1326             env->CallDoubleMethod(galileoIonosphericModelObj, method_galileoIonosphericModelGetAi1);
1327     ionosphericModel.ai1 = ai1;
1328     jdouble ai2 =
1329             env->CallDoubleMethod(galileoIonosphericModelObj, method_galileoIonosphericModelGetAi2);
1330     ionosphericModel.ai2 = ai2;
1331     ionosphericModelOpt = ionosphericModel;
1332 }
1333 
setGalileoSatelliteEphemeris(JNIEnv * env,jobject galileoSatelliteEphemerisListObj,std::vector<GalileoSatelliteEphemeris> & galileoSatelliteEphemerisList)1334 void GnssAssistanceUtil::setGalileoSatelliteEphemeris(
1335         JNIEnv* env, jobject galileoSatelliteEphemerisListObj,
1336         std::vector<GalileoSatelliteEphemeris>& galileoSatelliteEphemerisList) {
1337     if (galileoSatelliteEphemerisListObj == nullptr) return;
1338     auto len = env->CallIntMethod(galileoSatelliteEphemerisListObj, method_listSize);
1339     for (uint16_t i = 0; i < len; ++i) {
1340         jobject galileoSatelliteEphemerisObj =
1341                 env->CallObjectMethod(galileoSatelliteEphemerisListObj, method_listGet, i);
1342         GalileoSatelliteEphemeris galileoSatelliteEphemeris;
1343         GalileoSvHealth galileoSvHealth;
1344         // Set the svid of the satellite.
1345         jint svid = env->CallLongMethod(galileoSatelliteEphemerisObj,
1346                                         method_galileoSatelliteEphemerisGetSvid);
1347         galileoSatelliteEphemeris.svid = svid;
1348 
1349         // Set the satellite clock models.
1350         jobject galileoSatelliteClockModelListObj =
1351                 env->CallObjectMethod(galileoSatelliteEphemerisObj,
1352                                       method_galileoSatelliteEphemerisGetSatelliteClockModels);
1353         auto size = env->CallIntMethod(galileoSatelliteClockModelListObj, method_listSize);
1354         for (uint16_t j = 0; j < size; ++j) {
1355             jobject galileoSatelliteClockModelObj =
1356                     env->CallObjectMethod(galileoSatelliteClockModelListObj, method_listGet, j);
1357             if (galileoSatelliteClockModelObj == nullptr) continue;
1358             GalileoSatelliteClockModel galileoSatelliteClockModel;
1359             jdouble af0 = env->CallDoubleMethod(galileoSatelliteClockModelObj,
1360                                                 method_galileoSatelliteClockModelGetAf0);
1361             galileoSatelliteClockModel.af0 = af0;
1362             jdouble af1 = env->CallDoubleMethod(galileoSatelliteClockModelObj,
1363                                                 method_galileoSatelliteClockModelGetAf1);
1364             galileoSatelliteClockModel.af1 = af1;
1365             jdouble af2 = env->CallDoubleMethod(galileoSatelliteClockModelObj,
1366                                                 method_galileoSatelliteClockModelGetAf2);
1367             galileoSatelliteClockModel.af2 = af2;
1368             jdouble bgdSeconds =
1369                     env->CallDoubleMethod(galileoSatelliteClockModelObj,
1370                                           method_galileoSatelliteClockModelGetBgdSeconds);
1371             galileoSatelliteClockModel.bgdSeconds = bgdSeconds;
1372             jint satelliteClockType =
1373                     env->CallIntMethod(galileoSatelliteClockModelObj,
1374                                        method_galileoSatelliteClockModelGetSatelliteClockType);
1375             galileoSatelliteClockModel.satelliteClockType =
1376                     static_cast<GalileoSatelliteClockModel::SatelliteClockType>(satelliteClockType);
1377             jdouble sisaMeters =
1378                     env->CallDoubleMethod(galileoSatelliteClockModelObj,
1379                                           method_galileoSatelliteClockModelGetSisaMeters);
1380             galileoSatelliteClockModel.sisaMeters = sisaMeters;
1381             jdouble timeOfClockSeconds =
1382                     env->CallDoubleMethod(galileoSatelliteClockModelObj,
1383                                           method_galileoSatelliteClockModelGetTimeOfClockSeconds);
1384             galileoSatelliteClockModel.timeOfClockSeconds = timeOfClockSeconds;
1385             galileoSatelliteEphemeris.satelliteClockModel.push_back(galileoSatelliteClockModel);
1386             env->DeleteLocalRef(galileoSatelliteClockModelObj);
1387         }
1388         env->DeleteLocalRef(galileoSatelliteClockModelListObj);
1389 
1390         // Set the satelliteOrbitModel of the satellite.
1391         jobject satelliteOrbitModelObj =
1392                 env->CallObjectMethod(galileoSatelliteEphemerisObj,
1393                                       method_galileoSatelliteEphemerisGetSatelliteOrbitModel);
1394         GnssAssistanceUtil::setKeplerianOrbitModel(env, satelliteOrbitModelObj,
1395                                                    galileoSatelliteEphemeris.satelliteOrbitModel);
1396         env->DeleteLocalRef(satelliteOrbitModelObj);
1397 
1398         // Set the satellite health of the satellite clock model.
1399         jobject galileoSvHealthObj =
1400                 env->CallObjectMethod(galileoSatelliteEphemerisObj,
1401                                       method_galileoSatelliteEphemerisGetSatelliteHealth);
1402         jint dataValidityStatusE1b =
1403                 env->CallIntMethod(galileoSvHealthObj,
1404                                    method_galileoSvHealthGetDataValidityStatusE1b);
1405         galileoSvHealth.dataValidityStatusE1b =
1406                 static_cast<GalileoSvHealth::GalileoHealthDataVaidityType>(dataValidityStatusE1b);
1407         jint dataValidityStatusE5a =
1408                 env->CallIntMethod(galileoSvHealthObj,
1409                                    method_galileoSvHealthGetDataValidityStatusE5a);
1410         galileoSvHealth.dataValidityStatusE5a =
1411                 static_cast<GalileoSvHealth::GalileoHealthDataVaidityType>(dataValidityStatusE5a);
1412         jint dataValidityStatusE5b =
1413                 env->CallIntMethod(galileoSvHealthObj,
1414                                    method_galileoSvHealthGetDataValidityStatusE5b);
1415         galileoSvHealth.dataValidityStatusE5b =
1416                 static_cast<GalileoSvHealth::GalileoHealthDataVaidityType>(dataValidityStatusE5b);
1417         jint signalHealthStatusE1b =
1418                 env->CallIntMethod(galileoSvHealthObj,
1419                                    method_galileoSvHealthGetSignalHealthStatusE1b);
1420         galileoSvHealth.signalHealthStatusE1b =
1421                 static_cast<GalileoSvHealth::GalileoHealthStatusType>(signalHealthStatusE1b);
1422         jint signalHealthStatusE5a =
1423                 env->CallIntMethod(galileoSvHealthObj,
1424                                    method_galileoSvHealthGetSignalHealthStatusE5a);
1425         galileoSvHealth.signalHealthStatusE5a =
1426                 static_cast<GalileoSvHealth::GalileoHealthStatusType>(signalHealthStatusE5a);
1427         jint signalHealthStatusE5b =
1428                 env->CallIntMethod(galileoSvHealthObj,
1429                                    method_galileoSvHealthGetSignalHealthStatusE5b);
1430         galileoSvHealth.signalHealthStatusE5b =
1431                 static_cast<GalileoSvHealth::GalileoHealthStatusType>(signalHealthStatusE5b);
1432         galileoSatelliteEphemeris.svHealth = galileoSvHealth;
1433         env->DeleteLocalRef(galileoSvHealthObj);
1434 
1435         // Set the satelliteEphemerisTime of the satellite.
1436         jobject satelliteEphemerisTimeObj =
1437                 env->CallObjectMethod(galileoSatelliteEphemerisObj,
1438                                       method_galileoSatelliteEphemerisGetSatelliteEphemerisTime);
1439         GnssAssistanceUtil::setSatelliteEphemerisTime(env, satelliteEphemerisTimeObj,
1440                                                       galileoSatelliteEphemeris
1441                                                               .satelliteEphemerisTime);
1442         env->DeleteLocalRef(satelliteEphemerisTimeObj);
1443 
1444         galileoSatelliteEphemerisList.push_back(galileoSatelliteEphemeris);
1445         env->DeleteLocalRef(galileoSatelliteEphemerisObj);
1446     }
1447 }
1448 
setBeidouAssistance(JNIEnv * env,jobject beidouAssistanceObj,std::optional<BeidouAssistance> & beidouAssistanceOpt)1449 void GnssAssistanceUtil::setBeidouAssistance(JNIEnv* env, jobject beidouAssistanceObj,
1450                                              std::optional<BeidouAssistance>& beidouAssistanceOpt) {
1451     BeidouAssistance beidouAssistance;
1452     jobject beidouAlmanacObj =
1453             env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetAlmanac);
1454     jobject ionosphericModelObj =
1455             env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetIonosphericModel);
1456     jobject utcModelObj =
1457             env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetUtcModel);
1458     jobject leapSecondsModelObj =
1459             env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetLeapSecondsModel);
1460     jobject timeModelsObj =
1461             env->CallObjectMethod(beidouAssistanceObj, method_beidouAssistanceGetTimeModels);
1462     jobject satelliteEphemerisObj =
1463             env->CallObjectMethod(beidouAssistanceObj,
1464                                   method_beidouAssistanceGetSatelliteEphemeris);
1465     jobject realTimeIntegrityModelsObj =
1466             env->CallObjectMethod(beidouAssistanceObj,
1467                                   method_beidouAssistanceGetRealTimeIntegrityModels);
1468     jobject satelliteCorrectionsObj =
1469             env->CallObjectMethod(beidouAssistanceObj,
1470                                   method_beidouAssistanceGetSatelliteCorrections);
1471     jobject auxiliaryInformationsObj =
1472             env->CallObjectMethod(beidouAssistanceObj,
1473                                   method_beidouAssistanceGetAuxiliaryInformation);
1474     setGnssAlmanac(env, beidouAlmanacObj, beidouAssistance.almanac);
1475     setKlobucharIonosphericModel(env, ionosphericModelObj, beidouAssistance.ionosphericModel);
1476     setUtcModel(env, utcModelObj, beidouAssistance.utcModel);
1477     setLeapSecondsModel(env, leapSecondsModelObj, beidouAssistance.leapSecondsModel);
1478     setTimeModels(env, timeModelsObj, beidouAssistance.timeModels);
1479     setBeidouSatelliteEphemeris(env, satelliteEphemerisObj, beidouAssistance.satelliteEphemeris);
1480     setRealTimeIntegrityModels(env, realTimeIntegrityModelsObj,
1481                                beidouAssistance.realTimeIntegrityModels);
1482     setSatelliteCorrections(env, satelliteCorrectionsObj, beidouAssistance.satelliteCorrections);
1483     setAuxiliaryInformations(env, auxiliaryInformationsObj, beidouAssistance.auxiliaryInformations);
1484     beidouAssistanceOpt = beidouAssistance;
1485     env->DeleteLocalRef(beidouAlmanacObj);
1486     env->DeleteLocalRef(ionosphericModelObj);
1487     env->DeleteLocalRef(utcModelObj);
1488     env->DeleteLocalRef(leapSecondsModelObj);
1489     env->DeleteLocalRef(timeModelsObj);
1490     env->DeleteLocalRef(satelliteEphemerisObj);
1491     env->DeleteLocalRef(realTimeIntegrityModelsObj);
1492     env->DeleteLocalRef(satelliteCorrectionsObj);
1493     env->DeleteLocalRef(auxiliaryInformationsObj);
1494 }
1495 
setBeidouSatelliteEphemeris(JNIEnv * env,jobject beidouSatelliteEphemerisListObj,std::vector<BeidouSatelliteEphemeris> & beidouSatelliteEphemerisList)1496 void GnssAssistanceUtil::setBeidouSatelliteEphemeris(
1497         JNIEnv* env, jobject beidouSatelliteEphemerisListObj,
1498         std::vector<BeidouSatelliteEphemeris>& beidouSatelliteEphemerisList) {
1499     if (beidouSatelliteEphemerisListObj == nullptr) return;
1500     auto len = env->CallIntMethod(beidouSatelliteEphemerisListObj, method_listSize);
1501     for (uint16_t i = 0; i < len; ++i) {
1502         jobject beidouSatelliteEphemerisObj =
1503                 env->CallObjectMethod(beidouSatelliteEphemerisListObj, method_listGet, i);
1504         if (beidouSatelliteEphemerisObj == nullptr) continue;
1505         BeidouSatelliteEphemeris beidouSatelliteEphemeris;
1506 
1507         // Set the svid of the satellite.
1508         jint svid = env->CallIntMethod(beidouSatelliteEphemerisObj,
1509                                        method_beidouSatelliteEphemerisGetSvid);
1510         beidouSatelliteEphemeris.svid = static_cast<int32_t>(svid);
1511 
1512         // Set the satelliteClockModel of the satellite.
1513         jobject satelliteClockModelObj =
1514                 env->CallObjectMethod(beidouSatelliteEphemerisObj,
1515                                       method_beidouSatelliteEphemerisGetSatelliteClockModel);
1516         jdouble af0 = env->CallDoubleMethod(satelliteClockModelObj,
1517                                             method_beidouSatelliteClockModelGetAf0);
1518         jdouble af1 = env->CallDoubleMethod(satelliteClockModelObj,
1519                                             method_beidouSatelliteClockModelGetAf1);
1520         jdouble af2 = env->CallDoubleMethod(satelliteClockModelObj,
1521                                             method_beidouSatelliteClockModelGetAf2);
1522         jdouble tgd1 = env->CallDoubleMethod(satelliteClockModelObj,
1523                                              method_beidouSatelliteClockModelGetTgd1);
1524         jdouble tgd2 = env->CallDoubleMethod(satelliteClockModelObj,
1525                                              method_beidouSatelliteClockModelGetTgd2);
1526         jdouble aodc = env->CallDoubleMethod(satelliteClockModelObj,
1527                                              method_beidouSatelliteClockModelGetAodc);
1528         jlong timeOfClockSeconds =
1529                 env->CallLongMethod(satelliteClockModelObj,
1530                                     method_beidouSatelliteClockModelGetTimeOfClockSeconds);
1531         beidouSatelliteEphemeris.satelliteClockModel.af0 = af0;
1532         beidouSatelliteEphemeris.satelliteClockModel.af1 = af1;
1533         beidouSatelliteEphemeris.satelliteClockModel.af2 = af2;
1534         beidouSatelliteEphemeris.satelliteClockModel.tgd1 = tgd1;
1535         beidouSatelliteEphemeris.satelliteClockModel.tgd2 = tgd2;
1536         beidouSatelliteEphemeris.satelliteClockModel.aodc = aodc;
1537         beidouSatelliteEphemeris.satelliteClockModel.timeOfClockSeconds = timeOfClockSeconds;
1538         env->DeleteLocalRef(satelliteClockModelObj);
1539 
1540         // Set the satelliteOrbitModel of the satellite.
1541         jobject satelliteOrbitModelObj =
1542                 env->CallObjectMethod(beidouSatelliteEphemerisObj,
1543                                       method_beidouSatelliteEphemerisGetSatelliteOrbitModel);
1544         GnssAssistanceUtil::setKeplerianOrbitModel(env, satelliteOrbitModelObj,
1545                                                    beidouSatelliteEphemeris.satelliteOrbitModel);
1546         env->DeleteLocalRef(satelliteOrbitModelObj);
1547 
1548         // Set the satelliteHealth of the satellite.
1549         jobject satelliteHealthObj =
1550                 env->CallObjectMethod(beidouSatelliteEphemerisObj,
1551                                       method_beidouSatelliteEphemerisGetSatelliteHealth);
1552         jint satH1 = env->CallIntMethod(satelliteHealthObj, method_beidouSatelliteHealthGetSatH1);
1553         jint svAccur =
1554                 env->CallIntMethod(satelliteHealthObj, method_beidouSatelliteHealthGetSvAccur);
1555         beidouSatelliteEphemeris.satelliteHealth.satH1 = static_cast<int32_t>(satH1);
1556         beidouSatelliteEphemeris.satelliteHealth.svAccur = static_cast<int32_t>(svAccur);
1557         env->DeleteLocalRef(satelliteHealthObj);
1558 
1559         // Set the satelliteEphemerisTime of the satellite.
1560         jobject satelliteEphemerisTimeObj =
1561                 env->CallObjectMethod(beidouSatelliteEphemerisObj,
1562                                       method_beidouSatelliteEphemerisGetSatelliteEphemerisTime);
1563         jint aode = env->CallIntMethod(satelliteEphemerisTimeObj,
1564                                        method_beidouSatelliteEphemerisTimeGetAode);
1565         jint beidouWeekNumber =
1566                 env->CallIntMethod(satelliteEphemerisTimeObj,
1567                                    method_beidouSatelliteEphemerisTimeGetBeidouWeekNumber);
1568         jint toeSeconds = env->CallDoubleMethod(satelliteEphemerisTimeObj,
1569                                                 method_beidouSatelliteEphemerisTimeGetToeSeconds);
1570         beidouSatelliteEphemeris.satelliteEphemerisTime.aode = static_cast<int32_t>(aode);
1571         beidouSatelliteEphemeris.satelliteEphemerisTime.weekNumber =
1572                 static_cast<int32_t>(beidouWeekNumber);
1573         beidouSatelliteEphemeris.satelliteEphemerisTime.toeSeconds =
1574                 static_cast<int32_t>(toeSeconds);
1575         env->DeleteLocalRef(satelliteEphemerisTimeObj);
1576 
1577         beidouSatelliteEphemerisList.push_back(beidouSatelliteEphemeris);
1578         env->DeleteLocalRef(beidouSatelliteEphemerisObj);
1579     }
1580 }
1581 
setGpsAssistance(JNIEnv * env,jobject gpsAssistanceObj,std::optional<GpsAssistance> & gpsAssistanceOpt)1582 void GnssAssistanceUtil::setGpsAssistance(JNIEnv* env, jobject gpsAssistanceObj,
1583                                           std::optional<GpsAssistance>& gpsAssistanceOpt) {
1584     if (gpsAssistanceObj == nullptr) return;
1585     GpsAssistance gpsAssistance;
1586     jobject gnssAlmanacObj =
1587             env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetAlmanac);
1588     jobject ionosphericModelObj =
1589             env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetIonosphericModel);
1590     jobject utcModelObj = env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetUtcModel);
1591     jobject leapSecondsModelObj =
1592             env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetLeapSecondsModel);
1593     jobject timeModelsObj =
1594             env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetTimeModels);
1595     jobject satelliteEphemerisObj =
1596             env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetSatelliteEphemeris);
1597     jobject realTimeIntegrityModelsObj =
1598             env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetRealTimeIntegrityModels);
1599     jobject satelliteCorrectionsObj =
1600             env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetSatelliteCorrections);
1601     jobject auxiliaryInformationsObj =
1602             env->CallObjectMethod(gpsAssistanceObj, method_gpsAssistanceGetAuxiliaryInformation);
1603     setGnssAlmanac(env, gnssAlmanacObj, gpsAssistance.almanac);
1604     setKlobucharIonosphericModel(env, ionosphericModelObj, gpsAssistance.ionosphericModel);
1605     setUtcModel(env, utcModelObj, gpsAssistance.utcModel);
1606     setLeapSecondsModel(env, leapSecondsModelObj, gpsAssistance.leapSecondsModel);
1607     setTimeModels(env, timeModelsObj, gpsAssistance.timeModels);
1608     setGpsOrQzssSatelliteEphemeris<GpsSatelliteEphemeris>(env, satelliteEphemerisObj,
1609                                                           gpsAssistance.satelliteEphemeris);
1610     setRealTimeIntegrityModels(env, realTimeIntegrityModelsObj,
1611                                gpsAssistance.realTimeIntegrityModels);
1612     setSatelliteCorrections(env, satelliteCorrectionsObj, gpsAssistance.satelliteCorrections);
1613     setAuxiliaryInformations(env, auxiliaryInformationsObj, gpsAssistance.auxiliaryInformations);
1614     gpsAssistanceOpt = gpsAssistance;
1615     env->DeleteLocalRef(gnssAlmanacObj);
1616     env->DeleteLocalRef(ionosphericModelObj);
1617     env->DeleteLocalRef(utcModelObj);
1618     env->DeleteLocalRef(leapSecondsModelObj);
1619     env->DeleteLocalRef(timeModelsObj);
1620     env->DeleteLocalRef(satelliteEphemerisObj);
1621     env->DeleteLocalRef(realTimeIntegrityModelsObj);
1622     env->DeleteLocalRef(satelliteCorrectionsObj);
1623     env->DeleteLocalRef(auxiliaryInformationsObj);
1624 }
1625 
1626 /** Set the GPS/QZSS satellite ephemeris list. */
1627 template <class T>
setGpsOrQzssSatelliteEphemeris(JNIEnv * env,jobject satelliteEphemerisListObj,std::vector<T> & satelliteEphemerisList)1628 void GnssAssistanceUtil::setGpsOrQzssSatelliteEphemeris(JNIEnv* env,
1629                                                         jobject satelliteEphemerisListObj,
1630                                                         std::vector<T>& satelliteEphemerisList) {
1631     if (satelliteEphemerisListObj == nullptr) return;
1632     auto len = env->CallIntMethod(satelliteEphemerisListObj, method_listSize);
1633     for (uint16_t i = 0; i < len; ++i) {
1634         jobject satelliteEphemerisObj =
1635                 env->CallObjectMethod(satelliteEphemerisListObj, method_listGet, i);
1636         if (satelliteEphemerisObj == nullptr) continue;
1637         T satelliteEphemeris;
1638         // Set the svid of the satellite.
1639         jint svid = env->CallIntMethod(satelliteEphemerisObj, method_gpsSatelliteEphemerisGetSvid);
1640         satelliteEphemeris.svid = static_cast<int32_t>(svid);
1641 
1642         // Set the gpsL2Params of the satellite.
1643         jobject gpsL2ParamsObj = env->CallObjectMethod(satelliteEphemerisObj,
1644                                                        method_gpsSatelliteEphemerisGetGpsL2Params);
1645         jint l2Code = env->CallIntMethod(gpsL2ParamsObj, method_gpsL2ParamsGetL2Code);
1646         jint l2Flag = env->CallIntMethod(gpsL2ParamsObj, method_gpsL2ParamsGetL2Flag);
1647         satelliteEphemeris.gpsL2Params.l2Code = static_cast<int32_t>(l2Code);
1648         satelliteEphemeris.gpsL2Params.l2Flag = static_cast<int32_t>(l2Flag);
1649         env->DeleteLocalRef(gpsL2ParamsObj);
1650 
1651         // Set the satelliteClockModel of the satellite.
1652         jobject satelliteClockModelObj =
1653                 env->CallObjectMethod(satelliteEphemerisObj,
1654                                       method_gpsSatelliteEphemerisGetSatelliteClockModel);
1655         jdouble af0 =
1656                 env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetAf0);
1657         jdouble af1 =
1658                 env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetAf1);
1659         jdouble af2 =
1660                 env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetAf2);
1661         jdouble tgd =
1662                 env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetTgd);
1663         jint iodc =
1664                 env->CallDoubleMethod(satelliteClockModelObj, method_gpsSatelliteClockModelGetIodc);
1665         jlong timeOfClockSeconds =
1666                 env->CallLongMethod(satelliteClockModelObj,
1667                                     method_gpsSatelliteClockModelGetTimeOfClockSeconds);
1668         satelliteEphemeris.satelliteClockModel.af0 = af0;
1669         satelliteEphemeris.satelliteClockModel.af1 = af1;
1670         satelliteEphemeris.satelliteClockModel.af2 = af2;
1671         satelliteEphemeris.satelliteClockModel.tgd = tgd;
1672         satelliteEphemeris.satelliteClockModel.iodc = static_cast<int32_t>(iodc);
1673         satelliteEphemeris.satelliteClockModel.timeOfClockSeconds = timeOfClockSeconds;
1674         env->DeleteLocalRef(satelliteClockModelObj);
1675 
1676         // Set the satelliteOrbitModel of the satellite.
1677         jobject satelliteOrbitModelObj =
1678                 env->CallObjectMethod(satelliteEphemerisObj,
1679                                       method_gpsSatelliteEphemerisGetSatelliteOrbitModel);
1680         GnssAssistanceUtil::setKeplerianOrbitModel(env, satelliteOrbitModelObj,
1681                                                    satelliteEphemeris.satelliteOrbitModel);
1682         env->DeleteLocalRef(satelliteOrbitModelObj);
1683 
1684         // Set the satelliteHealth of the satellite.
1685         jobject satelliteHealthObj =
1686                 env->CallObjectMethod(satelliteEphemerisObj,
1687                                       method_gpsSatelliteEphemerisGetSatelliteHealth);
1688         jint svHealth =
1689                 env->CallIntMethod(satelliteHealthObj, method_gpsSatelliteHealthGetSvHealth);
1690         jdouble svAccur =
1691                 env->CallDoubleMethod(satelliteHealthObj, method_gpsSatelliteHealthGetSvAccur);
1692         jdouble fitInt = env->CallIntMethod(satelliteHealthObj, method_gpsSatelliteHealthGetFitInt);
1693         satelliteEphemeris.satelliteHealth.svHealth = static_cast<int32_t>(svHealth);
1694         satelliteEphemeris.satelliteHealth.svAccur = svAccur;
1695         satelliteEphemeris.satelliteHealth.fitInt = fitInt;
1696         env->DeleteLocalRef(satelliteHealthObj);
1697 
1698         // Set the satelliteEphemerisTime of the satellite.
1699         jobject satelliteEphemerisTimeObj =
1700                 env->CallObjectMethod(satelliteEphemerisObj,
1701                                       method_gpsSatelliteEphemerisGetSatelliteEphemerisTime);
1702         GnssAssistanceUtil::setSatelliteEphemerisTime(env, satelliteEphemerisTimeObj,
1703                                                       satelliteEphemeris.satelliteEphemerisTime);
1704         env->DeleteLocalRef(satelliteEphemerisTimeObj);
1705 
1706         satelliteEphemerisList.push_back(satelliteEphemeris);
1707         env->DeleteLocalRef(satelliteEphemerisObj);
1708     }
1709 }
1710 
setSatelliteCorrections(JNIEnv * env,jobject satelliteCorrectionsObj,std::vector<GnssSatelliteCorrections> & gnssSatelliteCorrectionsList)1711 void GnssAssistanceUtil::setSatelliteCorrections(
1712         JNIEnv* env, jobject satelliteCorrectionsObj,
1713         std::vector<GnssSatelliteCorrections>& gnssSatelliteCorrectionsList) {
1714     if (satelliteCorrectionsObj == nullptr) return;
1715     auto len = env->CallIntMethod(satelliteCorrectionsObj, method_listSize);
1716     for (uint16_t i = 0; i < len; ++i) {
1717         GnssSatelliteCorrections gnssSatelliteCorrections;
1718         jobject satelliteCorrectionObj =
1719                 env->CallObjectMethod(satelliteCorrectionsObj, method_listGet, i);
1720         if (satelliteCorrectionObj == nullptr) continue;
1721         jint svid = env->CallIntMethod(satelliteCorrectionObj, method_satelliteCorrectionGetSvid);
1722         gnssSatelliteCorrections.svid = svid;
1723         jobject ionosphericCorrectionsObj =
1724                 env->CallObjectMethod(satelliteCorrectionObj,
1725                                       method_satelliteCorrectionGetIonosphericCorrections);
1726         env->DeleteLocalRef(satelliteCorrectionObj);
1727         auto size = env->CallIntMethod(ionosphericCorrectionsObj, method_listSize);
1728         for (uint16_t j = 0; j < size; ++j) {
1729             jobject ionosphericCorrectionObj =
1730                     env->CallObjectMethod(ionosphericCorrectionsObj, method_listGet, j);
1731             if (ionosphericCorrectionObj == nullptr) continue;
1732             IonosphericCorrection ionosphericCorrection;
1733             jlong carrierFrequencyHz =
1734                     env->CallLongMethod(ionosphericCorrectionObj,
1735                                         method_ionosphericCorrectionGetCarrierFrequencyHz);
1736             ionosphericCorrection.carrierFrequencyHz = carrierFrequencyHz;
1737 
1738             jobject gnssCorrectionComponentObj =
1739                     env->CallObjectMethod(ionosphericCorrectionObj,
1740                                           method_ionosphericCorrectionGetIonosphericCorrection);
1741             env->DeleteLocalRef(ionosphericCorrectionObj);
1742 
1743             jstring sourceKey = static_cast<jstring>(
1744                     env->CallObjectMethod(gnssCorrectionComponentObj,
1745                                           method_gnssCorrectionComponentGetSourceKey));
1746             ScopedJniString jniSourceKey{env, sourceKey};
1747             ionosphericCorrection.ionosphericCorrectionComponent.sourceKey =
1748                     android::String16(jniSourceKey.c_str());
1749 
1750             jobject pseudorangeCorrectionObj =
1751                     env->CallObjectMethod(gnssCorrectionComponentObj,
1752                                           method_gnssCorrectionComponentGetPseudorangeCorrection);
1753             jdouble correctionMeters =
1754                     env->CallDoubleMethod(pseudorangeCorrectionObj,
1755                                           method_pseudorangeCorrectionGetCorrectionMeters);
1756             jdouble correctionUncertaintyMeters = env->CallDoubleMethod(
1757                     pseudorangeCorrectionObj,
1758                     method_pseudorangeCorrectionGetCorrectionUncertaintyMeters);
1759             jdouble correctionRateMetersPerSecond = env->CallDoubleMethod(
1760                     pseudorangeCorrectionObj,
1761                     method_pseudorangeCorrectionGetCorrectionRateMetersPerSecond);
1762             ionosphericCorrection.ionosphericCorrectionComponent.pseudorangeCorrection
1763                     .correctionMeters = correctionMeters;
1764             ionosphericCorrection.ionosphericCorrectionComponent.pseudorangeCorrection
1765                     .correctionUncertaintyMeters = correctionUncertaintyMeters;
1766             ionosphericCorrection.ionosphericCorrectionComponent.pseudorangeCorrection
1767                     .correctionRateMetersPerSecond = correctionRateMetersPerSecond;
1768             env->DeleteLocalRef(pseudorangeCorrectionObj);
1769 
1770             jobject gnssIntervalObj =
1771                     env->CallObjectMethod(gnssCorrectionComponentObj,
1772                                           method_gnssCorrectionComponentGetValidityInterval);
1773             jdouble startMillisSinceGpsEpoch =
1774                     env->CallDoubleMethod(gnssIntervalObj,
1775                                           method_gnssIntervalGetStartMillisSinceGpsEpoch);
1776             jdouble endMillisSinceGpsEpoch =
1777                     env->CallDoubleMethod(gnssIntervalObj,
1778                                           method_gnssIntervalGetEndMillisSinceGpsEpoch);
1779             ionosphericCorrection.ionosphericCorrectionComponent.validityInterval
1780                     .startMillisSinceGpsEpoch = startMillisSinceGpsEpoch;
1781             ionosphericCorrection.ionosphericCorrectionComponent.validityInterval
1782                     .endMillisSinceGpsEpoch = endMillisSinceGpsEpoch;
1783             env->DeleteLocalRef(gnssIntervalObj);
1784 
1785             env->DeleteLocalRef(gnssCorrectionComponentObj);
1786             gnssSatelliteCorrections.ionosphericCorrections.push_back(ionosphericCorrection);
1787         }
1788         gnssSatelliteCorrectionsList.push_back(gnssSatelliteCorrections);
1789         env->DeleteLocalRef(ionosphericCorrectionsObj);
1790     }
1791 }
1792 
setRealTimeIntegrityModels(JNIEnv * env,jobject realTimeIntegrityModelsObj,std::vector<RealTimeIntegrityModel> & realTimeIntegrityModels)1793 void GnssAssistanceUtil::setRealTimeIntegrityModels(
1794         JNIEnv* env, jobject realTimeIntegrityModelsObj,
1795         std::vector<RealTimeIntegrityModel>& realTimeIntegrityModels) {
1796     if (realTimeIntegrityModelsObj == nullptr) return;
1797     auto len = env->CallIntMethod(realTimeIntegrityModelsObj, method_listSize);
1798     for (uint16_t i = 0; i < len; ++i) {
1799         jobject realTimeIntegrityModelObj =
1800                 env->CallObjectMethod(realTimeIntegrityModelsObj, method_listGet, i);
1801         if (realTimeIntegrityModelObj == nullptr) continue;
1802         RealTimeIntegrityModel realTimeIntegrityModel;
1803         jint badSvid = env->CallIntMethod(realTimeIntegrityModelObj,
1804                                           method_realTimeIntegrityModelGetBadSvid);
1805         jobject badSignalTypesObj =
1806                 env->CallObjectMethod(realTimeIntegrityModelObj,
1807                                       method_realTimeIntegrityModelGetBadSignalTypes);
1808         auto badSignalTypesSize = env->CallIntMethod(badSignalTypesObj, method_listSize);
1809         for (uint16_t j = 0; j < badSignalTypesSize; ++j) {
1810             GnssSignalType badSignalType;
1811             jobject badSignalTypeObj = env->CallObjectMethod(badSignalTypesObj, method_listGet, j);
1812             if (badSignalTypeObj != nullptr) {
1813                 setGnssSignalType(env, badSignalTypeObj, badSignalType);
1814                 realTimeIntegrityModel.badSignalTypes.push_back(badSignalType);
1815                 env->DeleteLocalRef(badSignalTypeObj);
1816             }
1817         }
1818         jlong startDateSeconds =
1819                 env->CallLongMethod(realTimeIntegrityModelObj,
1820                                     method_realTimeIntegrityModelGetStartDateSeconds);
1821         jlong endDateSeconds = env->CallLongMethod(realTimeIntegrityModelObj,
1822                                                    method_realTimeIntegrityModelGetEndDateSeconds);
1823         jlong publishDateSeconds =
1824                 env->CallLongMethod(realTimeIntegrityModelObj,
1825                                     method_realTimeIntegrityModelGetPublishDateSeconds);
1826         jstring advisoryNumber = static_cast<jstring>(
1827                 env->CallObjectMethod(realTimeIntegrityModelObj,
1828                                       method_realTimeIntegrityModelGetAdvisoryNumber));
1829         ScopedJniString jniAdvisoryNumber{env, advisoryNumber};
1830         jstring advisoryType = static_cast<jstring>(
1831                 env->CallObjectMethod(realTimeIntegrityModelObj,
1832                                       method_realTimeIntegrityModelGetAdvisoryType));
1833         ScopedJniString jniAdvisoryType{env, advisoryType};
1834 
1835         realTimeIntegrityModel.badSvid = badSvid;
1836         realTimeIntegrityModel.startDateSeconds = startDateSeconds;
1837         realTimeIntegrityModel.endDateSeconds = endDateSeconds;
1838         realTimeIntegrityModel.publishDateSeconds = publishDateSeconds;
1839         realTimeIntegrityModel.advisoryNumber = android::String16(jniAdvisoryNumber.c_str());
1840         realTimeIntegrityModel.advisoryType = android::String16(jniAdvisoryType.c_str());
1841         realTimeIntegrityModels.push_back(realTimeIntegrityModel);
1842         env->DeleteLocalRef(badSignalTypesObj);
1843         env->DeleteLocalRef(realTimeIntegrityModelObj);
1844     }
1845 }
1846 
setGnssSignalType(JNIEnv * env,jobject gnssSignalTypeObj,GnssSignalType & gnssSignalType)1847 void GnssAssistanceUtil::setGnssSignalType(JNIEnv* env, jobject gnssSignalTypeObj,
1848                                            GnssSignalType& gnssSignalType) {
1849     if (gnssSignalTypeObj == nullptr) {
1850         ALOGE("gnssSignalTypeObj is null");
1851         return;
1852     }
1853     jint constellationType =
1854             env->CallIntMethod(gnssSignalTypeObj, method_gnssSignalTypeGetConstellationType);
1855     jdouble carrierFrequencyHz =
1856             env->CallIntMethod(gnssSignalTypeObj, method_gnssSignalTypeGetCarrierFrequencyHz);
1857     jstring codeType = static_cast<jstring>(
1858             env->CallObjectMethod(gnssSignalTypeObj, method_gnssSignalTypeGetCodeType));
1859     ScopedJniString jniCodeType{env, codeType};
1860 
1861     gnssSignalType.constellation = static_cast<GnssConstellationType>(constellationType);
1862     gnssSignalType.carrierFrequencyHz = static_cast<int32_t>(carrierFrequencyHz);
1863     gnssSignalType.codeType = std::string(jniCodeType.c_str());
1864 }
1865 
setTimeModels(JNIEnv * env,jobject timeModelsObj,std::vector<TimeModel> & timeModels)1866 void GnssAssistanceUtil::setTimeModels(JNIEnv* env, jobject timeModelsObj,
1867                                        std::vector<TimeModel>& timeModels) {
1868     if (timeModelsObj == nullptr) return;
1869     auto len = env->CallIntMethod(timeModelsObj, method_listSize);
1870     for (uint16_t i = 0; i < len; ++i) {
1871         jobject timeModelObj = env->CallObjectMethod(timeModelsObj, method_listGet, i);
1872         TimeModel timeModel;
1873         jint toGnss = env->CallIntMethod(timeModelObj, method_timeModelsGetToGnss);
1874         jlong timeOfWeek = env->CallLongMethod(timeModelObj, method_timeModelsGetTimeOfWeek);
1875         jint weekNumber = env->CallIntMethod(timeModelObj, method_timeModelsGetWeekNumber);
1876         jdouble a0 = env->CallDoubleMethod(timeModelObj, method_timeModelsGetA0);
1877         jdouble a1 = env->CallDoubleMethod(timeModelObj, method_timeModelsGetA1);
1878         timeModel.toGnss = static_cast<GnssConstellationType>(toGnss);
1879         timeModel.timeOfWeek = timeOfWeek;
1880         timeModel.weekNumber = static_cast<int32_t>(weekNumber);
1881         timeModel.a0 = a0;
1882         timeModel.a1 = a1;
1883         timeModels.push_back(timeModel);
1884         env->DeleteLocalRef(timeModelObj);
1885     }
1886 }
1887 
setLeapSecondsModel(JNIEnv * env,jobject leapSecondsModelObj,std::optional<LeapSecondsModel> & leapSecondsModelOpt)1888 void GnssAssistanceUtil::setLeapSecondsModel(JNIEnv* env, jobject leapSecondsModelObj,
1889                                              std::optional<LeapSecondsModel>& leapSecondsModelOpt) {
1890     if (leapSecondsModelObj == nullptr) return;
1891     LeapSecondsModel leapSecondsModel;
1892     jint dayNumberLeapSecondsFuture =
1893             env->CallIntMethod(leapSecondsModelObj,
1894                                method_leapSecondsModelGetDayNumberLeapSecondsFuture);
1895     jint leapSeconds =
1896             env->CallIntMethod(leapSecondsModelObj, method_leapSecondsModelGetLeapSeconds);
1897     jint leapSecondsFuture =
1898             env->CallIntMethod(leapSecondsModelObj, method_leapSecondsModelGetLeapSecondsFuture);
1899     jint weekNumberLeapSecondsFuture =
1900             env->CallIntMethod(leapSecondsModelObj,
1901                                method_leapSecondsModelGetWeekNumberLeapSecondsFuture);
1902     leapSecondsModel.dayNumberLeapSecondsFuture = static_cast<int32_t>(dayNumberLeapSecondsFuture);
1903     leapSecondsModel.leapSeconds = static_cast<int32_t>(leapSeconds);
1904     leapSecondsModel.leapSecondsFuture = static_cast<int32_t>(leapSecondsFuture);
1905     leapSecondsModel.weekNumberLeapSecondsFuture =
1906             static_cast<int32_t>(weekNumberLeapSecondsFuture);
1907     leapSecondsModelOpt = leapSecondsModel;
1908 }
1909 
setSatelliteEphemerisTime(JNIEnv * env,jobject satelliteEphemerisTimeObj,SatelliteEphemerisTime & satelliteEphemerisTime)1910 void GnssAssistanceUtil::setSatelliteEphemerisTime(JNIEnv* env, jobject satelliteEphemerisTimeObj,
1911                                                    SatelliteEphemerisTime& satelliteEphemerisTime) {
1912     if (satelliteEphemerisTimeObj == nullptr) return;
1913     jdouble iode =
1914             env->CallDoubleMethod(satelliteEphemerisTimeObj, method_satelliteEphemerisTimeGetIode);
1915     jdouble toeSeconds = env->CallDoubleMethod(satelliteEphemerisTimeObj,
1916                                                method_satelliteEphemerisTimeGetToeSeconds);
1917     jint weekNumber = env->CallIntMethod(satelliteEphemerisTimeObj,
1918                                          method_satelliteEphemerisTimeGetWeekNumber);
1919     satelliteEphemerisTime.iode = iode;
1920     satelliteEphemerisTime.toeSeconds = toeSeconds;
1921     satelliteEphemerisTime.weekNumber = weekNumber;
1922 }
1923 
setKeplerianOrbitModel(JNIEnv * env,jobject keplerianOrbitModelObj,KeplerianOrbitModel & keplerianOrbitModel)1924 void GnssAssistanceUtil::setKeplerianOrbitModel(JNIEnv* env, jobject keplerianOrbitModelObj,
1925                                                 KeplerianOrbitModel& keplerianOrbitModel) {
1926     if (keplerianOrbitModelObj == nullptr) return;
1927     jdouble rootA =
1928             env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetRootA);
1929     jdouble eccentricity = env->CallDoubleMethod(keplerianOrbitModelObj,
1930                                                  method_keplerianOrbitModelGetEccentricity);
1931     jdouble m0 = env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetM0);
1932     jdouble omega =
1933             env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetOmega);
1934     jdouble omegaDot =
1935             env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetOmegaDot);
1936     jdouble deltaN =
1937             env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetDeltaN);
1938     jdouble iDot = env->CallDoubleMethod(keplerianOrbitModelObj, method_keplerianOrbitModelGetIDot);
1939     jobject secondOrderHarmonicPerturbationObj =
1940             env->CallObjectMethod(keplerianOrbitModelObj,
1941                                   method_keplerianOrbitModelGetSecondOrderHarmonicPerturbation);
1942     jdouble cic = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj,
1943                                         method_secondOrderHarmonicPerturbationGetCic);
1944     jdouble cis = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj,
1945                                         method_secondOrderHarmonicPerturbationGetCis);
1946     jdouble crs = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj,
1947                                         method_secondOrderHarmonicPerturbationGetCrs);
1948     jdouble crc = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj,
1949                                         method_secondOrderHarmonicPerturbationGetCrc);
1950     jdouble cuc = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj,
1951                                         method_secondOrderHarmonicPerturbationGetCuc);
1952     jdouble cus = env->CallDoubleMethod(secondOrderHarmonicPerturbationObj,
1953                                         method_secondOrderHarmonicPerturbationGetCus);
1954     keplerianOrbitModel.rootA = rootA;
1955     keplerianOrbitModel.eccentricity = eccentricity;
1956     keplerianOrbitModel.m0 = m0;
1957     keplerianOrbitModel.omega = omega;
1958     keplerianOrbitModel.omegaDot = omegaDot;
1959     keplerianOrbitModel.deltaN = deltaN;
1960     keplerianOrbitModel.iDot = iDot;
1961     keplerianOrbitModel.secondOrderHarmonicPerturbation.cic = cic;
1962     keplerianOrbitModel.secondOrderHarmonicPerturbation.cis = cis;
1963     keplerianOrbitModel.secondOrderHarmonicPerturbation.crs = crs;
1964     keplerianOrbitModel.secondOrderHarmonicPerturbation.crc = crc;
1965     keplerianOrbitModel.secondOrderHarmonicPerturbation.cuc = cuc;
1966     keplerianOrbitModel.secondOrderHarmonicPerturbation.cus = cus;
1967     env->DeleteLocalRef(secondOrderHarmonicPerturbationObj);
1968 }
1969 
setKlobucharIonosphericModel(JNIEnv * env,jobject klobucharIonosphericModelObj,std::optional<KlobucharIonosphericModel> & klobucharIonosphericModelOpt)1970 void GnssAssistanceUtil::setKlobucharIonosphericModel(
1971         JNIEnv* env, jobject klobucharIonosphericModelObj,
1972         std::optional<KlobucharIonosphericModel>& klobucharIonosphericModelOpt) {
1973     if (klobucharIonosphericModelObj == nullptr) return;
1974     KlobucharIonosphericModel klobucharIonosphericModel;
1975     jdouble alpha0 = env->CallDoubleMethod(klobucharIonosphericModelObj,
1976                                            method_klobucharIonosphericModelGetAlpha0);
1977     jdouble alpha1 = env->CallDoubleMethod(klobucharIonosphericModelObj,
1978                                            method_klobucharIonosphericModelGetAlpha1);
1979     jdouble alpha2 = env->CallDoubleMethod(klobucharIonosphericModelObj,
1980                                            method_klobucharIonosphericModelGetAlpha2);
1981     jdouble alpha3 = env->CallDoubleMethod(klobucharIonosphericModelObj,
1982                                            method_klobucharIonosphericModelGetAlpha3);
1983     jdouble beta0 = env->CallDoubleMethod(klobucharIonosphericModelObj,
1984                                           method_klobucharIonosphericModelGetBeta0);
1985     jdouble beta1 = env->CallDoubleMethod(klobucharIonosphericModelObj,
1986                                           method_klobucharIonosphericModelGetBeta1);
1987     jdouble beta2 = env->CallDoubleMethod(klobucharIonosphericModelObj,
1988                                           method_klobucharIonosphericModelGetBeta2);
1989     jdouble beta3 = env->CallDoubleMethod(klobucharIonosphericModelObj,
1990                                           method_klobucharIonosphericModelGetBeta3);
1991     klobucharIonosphericModel.alpha0 = alpha0;
1992     klobucharIonosphericModel.alpha1 = alpha1;
1993     klobucharIonosphericModel.alpha2 = alpha2;
1994     klobucharIonosphericModel.alpha3 = alpha3;
1995     klobucharIonosphericModel.beta0 = beta0;
1996     klobucharIonosphericModel.beta1 = beta1;
1997     klobucharIonosphericModel.beta2 = beta2;
1998     klobucharIonosphericModel.beta3 = beta3;
1999     klobucharIonosphericModelOpt = klobucharIonosphericModel;
2000 }
2001 
setUtcModel(JNIEnv * env,jobject utcModelObj,std::optional<UtcModel> & utcModelOpt)2002 void GnssAssistanceUtil::setUtcModel(JNIEnv* env, jobject utcModelObj,
2003                                      std::optional<UtcModel>& utcModelOpt) {
2004     if (utcModelObj == nullptr) return;
2005     UtcModel utcModel;
2006     jdouble a0 = env->CallDoubleMethod(utcModelObj, method_utcModelGetA0);
2007     jdouble a1 = env->CallDoubleMethod(utcModelObj, method_utcModelGetA1);
2008     jlong timeOfWeek = env->CallLongMethod(utcModelObj, method_utcModelGetTimeOfWeek);
2009     jint weekNumber = env->CallIntMethod(utcModelObj, method_utcModelGetWeekNumber);
2010     utcModel.a0 = a0;
2011     utcModel.a1 = a1;
2012     utcModel.timeOfWeek = timeOfWeek;
2013     utcModel.weekNumber = static_cast<int32_t>(weekNumber);
2014     utcModelOpt = utcModel;
2015 }
2016 
setGnssAlmanac(JNIEnv * env,jobject gnssAlmanacObj,std::optional<GnssAlmanac> & gnssAlmanacOpt)2017 void GnssAssistanceUtil::setGnssAlmanac(JNIEnv* env, jobject gnssAlmanacObj,
2018                                         std::optional<GnssAlmanac>& gnssAlmanacOpt) {
2019     if (gnssAlmanacObj == nullptr) return;
2020     GnssAlmanac gnssAlmanac;
2021     jlong issueDateMillis =
2022             env->CallLongMethod(gnssAlmanacObj, method_gnssAlmanacGetIssueDateMillis);
2023     jint ioda = env->CallIntMethod(gnssAlmanacObj, method_gnssAlmanacGetIoda);
2024     jint weekNumber = env->CallIntMethod(gnssAlmanacObj, method_gnssAlmanacGetWeekNumber);
2025     jlong toaSeconds = env->CallLongMethod(gnssAlmanacObj, method_gnssAlmanacGetToaSeconds);
2026     jboolean isCompleteAlmanacProvided =
2027             env->CallBooleanMethod(gnssAlmanacObj, method_gnssAlmanacIsCompleteAlmanacProvided);
2028     gnssAlmanac.issueDateMs = issueDateMillis;
2029     gnssAlmanac.ioda = ioda;
2030     gnssAlmanac.weekNumber = weekNumber;
2031     gnssAlmanac.toaSeconds = toaSeconds;
2032     gnssAlmanac.isCompleteAlmanacProvided = isCompleteAlmanacProvided;
2033 
2034     jobject satelliteAlmanacsListObj =
2035             env->CallObjectMethod(gnssAlmanacObj, method_gnssAlmanacGetSatelliteAlmanacs);
2036     auto len = env->CallIntMethod(satelliteAlmanacsListObj, method_listSize);
2037     std::vector<GnssSatelliteAlmanac> list(len);
2038     for (uint16_t i = 0; i < len; ++i) {
2039         jobject gnssSatelliteAlmanacObj =
2040                 env->CallObjectMethod(satelliteAlmanacsListObj, method_listGet, i);
2041         if (gnssSatelliteAlmanacObj == nullptr) continue;
2042         GnssSatelliteAlmanac gnssSatelliteAlmanac;
2043         jint svid = env->CallIntMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetSvid);
2044         jint svHealth =
2045                 env->CallIntMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetSvHealth);
2046         jdouble af0 = env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetAf0);
2047         jdouble af1 = env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetAf1);
2048         jdouble eccentricity = env->CallDoubleMethod(gnssSatelliteAlmanacObj,
2049                                                      method_satelliteAlmanacGetEccentricity);
2050         jdouble inclination = env->CallDoubleMethod(gnssSatelliteAlmanacObj,
2051                                                     method_satelliteAlmanacGetInclination);
2052         jdouble m0 = env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetM0);
2053         jdouble omega =
2054                 env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetOmega);
2055         jdouble omega0 =
2056                 env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetOmega0);
2057         jdouble omegaDot =
2058                 env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetOmegaDot);
2059         jdouble rootA =
2060                 env->CallDoubleMethod(gnssSatelliteAlmanacObj, method_satelliteAlmanacGetRootA);
2061         gnssSatelliteAlmanac.svid = static_cast<int32_t>(svid);
2062         gnssSatelliteAlmanac.svHealth = static_cast<int32_t>(svHealth);
2063         gnssSatelliteAlmanac.af0 = af0;
2064         gnssSatelliteAlmanac.af1 = af1;
2065         gnssSatelliteAlmanac.eccentricity = eccentricity;
2066         gnssSatelliteAlmanac.inclination = inclination;
2067         gnssSatelliteAlmanac.m0 = m0;
2068         gnssSatelliteAlmanac.omega = omega;
2069         gnssSatelliteAlmanac.omega0 = omega0;
2070         gnssSatelliteAlmanac.omegaDot = omegaDot;
2071         gnssSatelliteAlmanac.rootA = rootA;
2072         list.at(i) = gnssSatelliteAlmanac;
2073         env->DeleteLocalRef(gnssSatelliteAlmanacObj);
2074     }
2075     gnssAlmanac.satelliteAlmanacs = list;
2076     gnssAlmanacOpt = gnssAlmanac;
2077     env->DeleteLocalRef(satelliteAlmanacsListObj);
2078 }
2079 
setAuxiliaryInformations(JNIEnv * env,jobject auxiliaryInformationListObj,std::vector<AuxiliaryInformation> & auxiliaryInformations)2080 void GnssAssistanceUtil::setAuxiliaryInformations(
2081         JNIEnv* env, jobject auxiliaryInformationListObj,
2082         std::vector<AuxiliaryInformation>& auxiliaryInformations) {
2083     if (auxiliaryInformationListObj == nullptr) return;
2084     auto len = env->CallIntMethod(auxiliaryInformationListObj, method_listSize);
2085     for (uint16_t i = 0; i < len; ++i) {
2086         AuxiliaryInformation auxiliaryInformation;
2087         jobject auxiliaryInformationObj =
2088                 env->CallObjectMethod(auxiliaryInformationListObj, method_listGet, i);
2089         if (auxiliaryInformationObj == nullptr) continue;
2090 
2091         jint svid = env->CallIntMethod(auxiliaryInformationObj, method_auxiliaryInformationGetSvid);
2092         auxiliaryInformation.svid = static_cast<int32_t>(svid);
2093 
2094         jobject availableSignalTypesObj =
2095                 env->CallObjectMethod(auxiliaryInformationObj,
2096                                       method_auxiliaryInformationGetAvailableSignalTypes);
2097         auto size = env->CallIntMethod(availableSignalTypesObj, method_listSize);
2098         std::vector<GnssSignalType> availableSignalTypes(size);
2099         for (uint16_t i = 0; i < size; ++i) {
2100             jobject availableSignalTypeObj =
2101                     env->CallObjectMethod(availableSignalTypesObj, method_listGet, i);
2102             GnssSignalType availableSignalType;
2103             setGnssSignalType(env, availableSignalTypeObj, availableSignalType);
2104             availableSignalTypes.at(i) = availableSignalType;
2105             env->DeleteLocalRef(availableSignalTypeObj);
2106         }
2107         auxiliaryInformation.availableSignalTypes = availableSignalTypes;
2108         env->DeleteLocalRef(availableSignalTypesObj);
2109 
2110         jint frequencyChannelNumber =
2111                 env->CallIntMethod(auxiliaryInformationObj,
2112                                    method_auxiliaryInformationGetFrequencyChannelNumber);
2113         auxiliaryInformation.frequencyChannelNumber = static_cast<int32_t>(frequencyChannelNumber);
2114 
2115         jint satType =
2116                 env->CallIntMethod(auxiliaryInformationObj, method_auxiliaryInformationGetSatType);
2117         auxiliaryInformation.satType = static_cast<BeidouB1CSatelliteOrbitType>(satType);
2118         env->DeleteLocalRef(auxiliaryInformationObj);
2119         auxiliaryInformations.push_back(auxiliaryInformation);
2120     }
2121 }
2122 
2123 } // namespace android::gnss
2124