summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Pierre Fite-georgel <pfg@google.com> 2019-02-26 22:32:34 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-02-26 22:32:34 +0000
commitd6dacc87328aa197eef5f2853d4f6cb4975f6049 (patch)
tree665e84da96df4fb19c15df4d7b019664c5366a28
parentea548cc3ab5ef2782d08243358d6463f17c7627a (diff)
parentb50cdaf4477af32be5ed4114c01ccb5c897c3ecd (diff)
Merge "Updating Framework to support update to the GnssLocation HAL v2.0."
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java38
-rw-r--r--services/core/jni/com_android_server_location_GnssLocationProvider.cpp245
2 files changed, 185 insertions, 98 deletions
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 28fdd95afb6a..51563008464c 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -140,6 +140,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private static final int LOCATION_HAS_SPEED_ACCURACY = 64;
private static final int LOCATION_HAS_BEARING_ACCURACY = 128;
+ // these need to match ElapsedRealtimeFlags enum in types.hal
+ private static final int ELAPSED_REALTIME_HAS_TIMESTAMP_NS = 1;
+
// IMPORTANT - the GPS_DELETE_* symbols here must match GnssAidingData enum in IGnss.hal
private static final int GPS_DELETE_EPHEMERIS = 0x0001;
private static final int GPS_DELETE_ALMANAC = 0x0002;
@@ -757,10 +760,16 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
float speedAccuracyMetersPerSecond = location.getSpeedAccuracyMetersPerSecond();
float bearingAccuracyDegrees = location.getBearingAccuracyDegrees();
long timestamp = location.getTime();
- native_inject_best_location(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
- altitudeMeters, speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
- verticalAccuracyMeters, speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
- timestamp);
+
+ int elapsedRealtimeFlags = ELAPSED_REALTIME_HAS_TIMESTAMP_NS;
+ long elapsedRealtimeNanos = location.getElapsedRealtimeNanos();
+
+ native_inject_best_location(
+ gnssLocationFlags, latitudeDegrees, longitudeDegrees,
+ altitudeMeters, speedMetersPerSec, bearingDegrees,
+ horizontalAccuracyMeters, verticalAccuracyMeters,
+ speedAccuracyMetersPerSecond, bearingAccuracyDegrees, timestamp,
+ elapsedRealtimeFlags, elapsedRealtimeNanos);
}
/** Returns true if the location request is too frequent. */
@@ -1260,9 +1269,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
if (VERBOSE) Log.v(TAG, "reportLocation " + location.toString());
- // It would be nice to push the elapsed real-time timestamp
- // further down the stack, but this is still useful
- location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
location.setExtras(mLocationExtras.getBundle());
reportLocation(location);
@@ -2151,17 +2157,11 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
private native int native_read_nmea(byte[] buffer, int bufferSize);
private native void native_inject_best_location(
- int gnssLocationFlags,
- double latitudeDegrees,
- double longitudeDegrees,
- double altitudeMeters,
- float speedMetersPerSec,
- float bearingDegrees,
- float horizontalAccuracyMeters,
- float verticalAccuracyMeters,
- float speedAccuracyMetersPerSecond,
- float bearingAccuracyDegrees,
- long timestamp);
+ int gnssLocationFlags, double latitudeDegrees, double longitudeDegrees,
+ double altitudeMeters, float speedMetersPerSec, float bearingDegrees,
+ float horizontalAccuracyMeters, float verticalAccuracyMeters,
+ float speedAccuracyMetersPerSecond, float bearingAccuracyDegrees,
+ long timestamp, int elapsedRealtimeFlags, long elapsedRealtimeNanos);
private native void native_inject_location(double latitude, double longitude, float accuracy);
@@ -2188,4 +2188,4 @@ public class GnssLocationProvider extends AbstractLocationProvider implements
int lac, int cid);
private native void native_agps_set_id(int type, String setid);
-} \ No newline at end of file
+}
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index fe941681a7be..03240c076ede 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -36,13 +36,14 @@
#include "android_runtime/Log.h"
#include <arpa/inet.h>
+#include <cinttypes>
+#include <iomanip>
#include <limits>
#include <linux/in.h>
#include <linux/in6.h>
#include <pthread.h>
#include <string.h>
-#include <cinttypes>
-#include <iomanip>
+#include <utils/SystemClock.h>
static jobject mCallbacksObj = nullptr;
@@ -111,10 +112,9 @@ using android::hardware::Void;
using android::hardware::hidl_vec;
using android::hardware::hidl_string;
using android::hardware::hidl_death_recipient;
+
using android::hardware::gnss::V1_0::GnssConstellationType;
-using android::hardware::gnss::V1_0::GnssLocation;
using android::hardware::gnss::V1_0::GnssLocationFlags;
-
using android::hardware::gnss::V1_0::IAGnssRilCallback;
using android::hardware::gnss::V1_0::IGnssBatching;
using android::hardware::gnss::V1_0::IGnssBatchingCallback;
@@ -128,13 +128,17 @@ using android::hardware::gnss::V1_0::IGnssNiCallback;
using android::hardware::gnss::V1_0::IGnssXtra;
using android::hardware::gnss::V1_0::IGnssXtraCallback;
+using android::hardware::gnss::V2_0::ElapsedRealtimeFlags;
using android::hardware::gnss::V2_0::IGnssCallback;
+
using android::hardware::gnss::measurement_corrections::V1_0::MeasurementCorrections;
using android::hardware::gnss::measurement_corrections::V1_0::SingleSatCorrection;
using android::hardware::gnss::measurement_corrections::V1_0::ReflectingPlane;
using android::hidl::base::V1_0::IBase;
+using GnssLocation_V1_0 = android::hardware::gnss::V1_0::GnssLocation;
+using GnssLocation_V2_0 = android::hardware::gnss::V2_0::GnssLocation;
using IGnss_V1_0 = android::hardware::gnss::V1_0::IGnss;
using IGnss_V1_1 = android::hardware::gnss::V1_1::IGnss;
using IGnss_V2_0 = android::hardware::gnss::V2_0::IGnss;
@@ -204,6 +208,20 @@ sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr;
namespace android {
+namespace {
+
+// Returns true if location has lat/long information.
+bool hasLatLong(const GnssLocation_V1_0& location) {
+ return (static_cast<uint32_t>(location.gnssLocationFlags) &
+ GnssLocationFlags::HAS_LAT_LONG) != 0;
+}
+
+// Returns true if location has lat/long information.
+bool hasLatLong(const GnssLocation_V2_0& location) {
+ return hasLatLong(location.v1_0);
+}
+
+} // namespace
template<class T>
class JavaMethodHelper {
public:
@@ -216,7 +234,7 @@ class JavaMethodHelper {
T value);
private:
- static const char *const signature_;
+ static const char* const signature_;
};
template<class T>
@@ -234,6 +252,8 @@ class JavaObject {
public:
JavaObject(JNIEnv* env, const char* class_name);
JavaObject(JNIEnv* env, const char* class_name, const char * sz_arg_1);
+ JavaObject(JNIEnv* env, const char* class_name, jobject object);
+
virtual ~JavaObject();
template<class T>
@@ -260,6 +280,11 @@ JavaObject::JavaObject(JNIEnv* env, const char* class_name, const char * sz_arg_
object_ = env_->NewObject(clazz_, ctor, env->NewStringUTF(sz_arg_1));
}
+JavaObject::JavaObject(JNIEnv* env, const char* class_name, jobject object)
+ : env_(env), object_(object) {
+ clazz_ = env_->FindClass(class_name);
+}
+
JavaObject::~JavaObject() {
env_->DeleteLocalRef(clazz_);
}
@@ -303,6 +328,8 @@ const char *const JavaMethodHelper<uint32_t>::signature_ = "(I)V";
template<>
const char *const JavaMethodHelper<int64_t>::signature_ = "(J)V";
template<>
+const char *const JavaMethodHelper<uint64_t>::signature_ = "(J)V";
+template<>
const char *const JavaMethodHelper<float>::signature_ = "(F)V";
template<>
const char *const JavaMethodHelper<double>::signature_ = "(D)V";
@@ -416,7 +443,8 @@ static JNIEnv* getJniEnv() {
return env;
}
-static jobject translateLocation(JNIEnv* env, const GnssLocation& location) {
+static jobject translateGnssLocation(JNIEnv* env,
+ const GnssLocation_V1_0& location) {
JavaObject object(env, "android/location/Location", "gps");
uint16_t flags = static_cast<uint32_t>(location.gnssLocationFlags);
@@ -446,23 +474,33 @@ static jobject translateLocation(JNIEnv* env, const GnssLocation& location) {
SET(BearingAccuracyDegrees, location.bearingAccuracyDegrees);
}
SET(Time, location.timestamp);
+ SET(ElapsedRealtimeNanos, android::elapsedRealtimeNano());
return object.get();
}
-static GnssLocation createGnssLocation(
- jint gnssLocationFlags,
- jdouble latitudeDegrees,
- jdouble longitudeDegrees,
- jdouble altitudeMeters,
- jfloat speedMetersPerSec,
- jfloat bearingDegrees,
- jfloat horizontalAccuracyMeters,
- jfloat verticalAccuracyMeters,
- jfloat speedAccuracyMetersPerSecond,
- jfloat bearingAccuracyDegrees,
+static jobject translateGnssLocation(JNIEnv* env,
+ const GnssLocation_V2_0& location) {
+ JavaObject object(env, "android/location/Location",
+ translateGnssLocation(env, location.v1_0));
+
+ const uint16_t flags = static_cast<uint16_t>(location.elapsedRealtime.flags);
+
+ // Overwrite ElapsedRealtimeNanos when available from HAL.
+ if (flags & ElapsedRealtimeFlags::HAS_TIMESTAMP_NS) {
+ SET(ElapsedRealtimeNanos, location.elapsedRealtime.timestampNs);
+ }
+
+ return object.get();
+}
+
+static GnssLocation_V1_0 createGnssLocation_V1_0(
+ jint gnssLocationFlags, jdouble latitudeDegrees, jdouble longitudeDegrees,
+ jdouble altitudeMeters, jfloat speedMetersPerSec, jfloat bearingDegrees,
+ jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
+ jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees,
jlong timestamp) {
- GnssLocation location;
+ GnssLocation_V1_0 location;
location.gnssLocationFlags = static_cast<uint16_t>(gnssLocationFlags);
location.latitudeDegrees = static_cast<double>(latitudeDegrees);
location.longitudeDegrees = static_cast<double>(longitudeDegrees);
@@ -478,11 +516,30 @@ static GnssLocation createGnssLocation(
return location;
}
+static GnssLocation_V2_0 createGnssLocation_V2_0(
+ jint gnssLocationFlags, jdouble latitudeDegrees, jdouble longitudeDegrees,
+ jdouble altitudeMeters, jfloat speedMetersPerSec, jfloat bearingDegrees,
+ jfloat horizontalAccuracyMeters, jfloat verticalAccuracyMeters,
+ jfloat speedAccuracyMetersPerSecond, jfloat bearingAccuracyDegrees,
+ jlong timestamp, jint elapsedRealtimeFlags, jlong elapsedRealtimeNanos) {
+ GnssLocation_V2_0 location;
+ location.v1_0 = createGnssLocation_V1_0(
+ gnssLocationFlags, latitudeDegrees, longitudeDegrees, altitudeMeters,
+ speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
+ verticalAccuracyMeters, speedAccuracyMetersPerSecond,
+ bearingAccuracyDegrees, timestamp);
+
+ location.elapsedRealtime.flags = static_cast<uint16_t>(elapsedRealtimeFlags);
+ location.elapsedRealtime.timestampNs = static_cast<uint64_t>(elapsedRealtimeNanos);
+
+ return location;
+}
+
/*
* GnssCallback class implements the callback methods for IGnss interface.
*/
struct GnssCallback : public IGnssCallback {
- Return<void> gnssLocationCb(const GnssLocation& location) override;
+ Return<void> gnssLocationCb(const GnssLocation_V1_0& location) override;
Return<void> gnssStatusCb(const IGnssCallback::GnssStatusValue status) override;
Return<void> gnssSvStatusCb(const IGnssCallback::GnssSvStatus& svStatus) override;
Return<void> gnssNmeaCb(int64_t timestamp, const android::hardware::hidl_string& nmea) override;
@@ -496,7 +553,13 @@ struct GnssCallback : public IGnssCallback {
// New in 1.1
Return<void> gnssNameCb(const android::hardware::hidl_string& name) override;
+ // New in 2.0
Return<void> gnssSetCapabilitiesCb_2_0(uint32_t capabilities) override;
+ Return<void> gnssLocationCb_2_0(const GnssLocation_V2_0& location) override;
+
+ // Templated implementation for gnnsLocationCb and gnnsLocationCb_2_0.
+ template <class T>
+ Return<void> gnssLocationCbImpl(const T& location);
// TODO(b/73306084): Reconsider allocation cost vs threadsafety on these statics
static const char* sNmeaString;
@@ -517,22 +580,30 @@ Return<void> GnssCallback::gnssNameCb(const android::hardware::hidl_string& name
const char* GnssCallback::sNmeaString = nullptr;
size_t GnssCallback::sNmeaStringLength = 0;
-Return<void> GnssCallback::gnssLocationCb(const GnssLocation& location) {
+template<class T>
+Return<void> GnssCallback::gnssLocationCbImpl(const T& location) {
JNIEnv* env = getJniEnv();
- jobject jLocation = translateLocation(env, location);
- bool hasLatLong = (static_cast<uint32_t>(location.gnssLocationFlags) &
- GnssLocationFlags::HAS_LAT_LONG) != 0;
+ jobject jLocation = translateGnssLocation(env, location);
env->CallVoidMethod(mCallbacksObj,
method_reportLocation,
- boolToJbool(hasLatLong),
+ boolToJbool(hasLatLong(location)),
jLocation);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
env->DeleteLocalRef(jLocation);
return Void();
}
+Return<void> GnssCallback::gnssLocationCb(const GnssLocation_V1_0& location) {
+ return gnssLocationCbImpl<GnssLocation_V1_0>(location);
+}
+
+Return<void>
+GnssCallback::gnssLocationCb_2_0(const GnssLocation_V2_0& location) {
+ return gnssLocationCbImpl<GnssLocation_V2_0>(location);
+}
+
Return<void> GnssCallback::gnssStatusCb(const IGnssCallback::GnssStatusValue status) {
JNIEnv* env = getJniEnv();
env->CallVoidMethod(mCallbacksObj, method_reportStatus, status);
@@ -681,12 +752,13 @@ struct GnssGeofenceCallback : public IGnssGeofenceCallback {
// Methods from ::android::hardware::gps::V1_0::IGnssGeofenceCallback follow.
Return<void> gnssGeofenceTransitionCb(
int32_t geofenceId,
- const GnssLocation& location,
+ const GnssLocation_V1_0& location,
GeofenceTransition transition,
hardware::gnss::V1_0::GnssUtcTime timestamp) override;
- Return<void> gnssGeofenceStatusCb(
+ Return<void>
+ gnssGeofenceStatusCb(
GeofenceAvailability status,
- const GnssLocation& location) override;
+ const GnssLocation_V1_0& location) override;
Return<void> gnssGeofenceAddCb(int32_t geofenceId,
GeofenceStatus status) override;
Return<void> gnssGeofenceRemoveCb(int32_t geofenceId,
@@ -698,13 +770,12 @@ struct GnssGeofenceCallback : public IGnssGeofenceCallback {
};
Return<void> GnssGeofenceCallback::gnssGeofenceTransitionCb(
- int32_t geofenceId,
- const GnssLocation& location,
+ int32_t geofenceId, const GnssLocation_V1_0& location,
GeofenceTransition transition,
hardware::gnss::V1_0::GnssUtcTime timestamp) {
JNIEnv* env = getJniEnv();
- jobject jLocation = translateLocation(env, location);
+ jobject jLocation = translateGnssLocation(env, location);
env->CallVoidMethod(mCallbacksObj,
method_reportGeofenceTransition,
@@ -718,16 +789,14 @@ Return<void> GnssGeofenceCallback::gnssGeofenceTransitionCb(
return Void();
}
-Return<void> GnssGeofenceCallback::gnssGeofenceStatusCb(
- GeofenceAvailability status,
- const GnssLocation& location) {
+Return<void>
+GnssGeofenceCallback::gnssGeofenceStatusCb(GeofenceAvailability status,
+ const GnssLocation_V1_0& location) {
JNIEnv* env = getJniEnv();
- jobject jLocation = translateLocation(env, location);
+ jobject jLocation = translateGnssLocation(env, location);
- env->CallVoidMethod(mCallbacksObj,
- method_reportGeofenceStatus,
- status,
+ env->CallVoidMethod(mCallbacksObj, method_reportGeofenceStatus, status,
jLocation);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
env->DeleteLocalRef(jLocation);
@@ -1296,18 +1365,18 @@ struct GnssBatchingCallback : public IGnssBatchingCallback {
* Methods from ::android::hardware::gps::V1_0::IGnssBatchingCallback
* follow.
*/
- Return<void> gnssLocationBatchCb(const hidl_vec<GnssLocation> & locations)
- override;
+ Return<void> gnssLocationBatchCb(const hidl_vec<GnssLocation_V1_0>& locations) override;
};
-Return<void> GnssBatchingCallback::gnssLocationBatchCb(const hidl_vec<GnssLocation> & locations) {
+Return<void> GnssBatchingCallback::gnssLocationBatchCb(
+ const hidl_vec<GnssLocation_V1_0>& locations) {
JNIEnv* env = getJniEnv();
jobjectArray jLocations = env->NewObjectArray(locations.size(),
env->FindClass("android/location/Location"), nullptr);
for (uint16_t i = 0; i < locations.size(); ++i) {
- jobject jLocation = translateLocation(env, locations[i]);
+ jobject jLocation = translateGnssLocation(env, locations[i]);
env->SetObjectArrayElement(jLocations, i, jLocation);
env->DeleteLocalRef(jLocation);
}
@@ -1760,7 +1829,7 @@ static void android_location_GnssLocationProvider_agps_set_reference_location_ce
agnssRilIface->setRefLocation(location);
}
-static void android_location_GnssLocationProvider_agps_set_id(JNIEnv *env, jobject /* obj */,
+static void android_location_GnssLocationProvider_agps_set_id(JNIEnv* env, jobject /* obj */,
jint type, jstring setid_string) {
if (agnssRilIface == nullptr) {
ALOGE("no AGPS RIL interface in agps_set_id");
@@ -1806,9 +1875,34 @@ static void android_location_GnssLocationProvider_inject_best_location(
jfloat verticalAccuracyMeters,
jfloat speedAccuracyMetersPerSecond,
jfloat bearingAccuracyDegrees,
- jlong timestamp) {
+ jlong timestamp,
+ jint elapsedRealtimeFlags,
+ jlong elapsedRealtimeNanos) {
+ if (gnssHal_V2_0 != nullptr) {
+ GnssLocation_V2_0 location = createGnssLocation_V2_0(
+ gnssLocationFlags,
+ latitudeDegrees,
+ longitudeDegrees,
+ altitudeMeters,
+ speedMetersPerSec,
+ bearingDegrees,
+ horizontalAccuracyMeters,
+ verticalAccuracyMeters,
+ speedAccuracyMetersPerSecond,
+ bearingAccuracyDegrees,
+ timestamp,
+ elapsedRealtimeFlags,
+ elapsedRealtimeNanos);
+ auto result = gnssHal_V2_0->injectBestLocation_2_0(location);
+
+ if (!result.isOk() || !result) {
+ ALOGE("%s: Gnss injectBestLocation() failed.", __func__);
+ }
+ return;
+ }
+
if (gnssHal_V1_1 != nullptr) {
- GnssLocation location = createGnssLocation(
+ GnssLocation_V1_0 location = createGnssLocation_V1_0(
gnssLocationFlags,
latitudeDegrees,
longitudeDegrees,
@@ -1821,12 +1915,14 @@ static void android_location_GnssLocationProvider_inject_best_location(
bearingAccuracyDegrees,
timestamp);
auto result = gnssHal_V1_1->injectBestLocation(location);
+
if (!result.isOk() || !result) {
ALOGE("%s: Gnss injectBestLocation() failed.", __func__);
}
- } else {
- ALOGE("%s: injectBestLocation() is called but gnssHal_V1_1 is not available.", __func__);
+ return;
}
+
+ ALOGE("%s: injectBestLocation() is called but gnssHal_V1_1 is not available.", __func__);
}
static void android_location_GnssLocationProvider_inject_location(JNIEnv* /* env */,
@@ -2695,45 +2791,36 @@ static const JNINativeMethod sMethods[] = {
{"native_init", "()Z", reinterpret_cast<void *>(android_location_GnssLocationProvider_init)},
{"native_cleanup", "()V", reinterpret_cast<void *>(
android_location_GnssLocationProvider_cleanup)},
- {"native_set_position_mode",
- "(IIIIIZ)Z",
- reinterpret_cast<void*>(android_location_GnssLocationProvider_set_position_mode)},
- {"native_start", "()Z", reinterpret_cast<void*>(android_location_GnssLocationProvider_start)},
- {"native_stop", "()Z", reinterpret_cast<void*>(android_location_GnssLocationProvider_stop)},
- {"native_delete_aiding_data",
- "(I)V",
- reinterpret_cast<void*>(android_location_GnssLocationProvider_delete_aiding_data)},
+ {"native_set_position_mode", "(IIIIIZ)Z", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_set_position_mode)},
+ {"native_start", "()Z", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_start)},
+ {"native_stop", "()Z", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_stop)},
+ {"native_delete_aiding_data", "(I)V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_delete_aiding_data)},
{"native_read_nmea", "([BI)I", reinterpret_cast<void *>(
android_location_GnssLocationProvider_read_nmea)},
{"native_inject_time", "(JJI)V", reinterpret_cast<void *>(
android_location_GnssLocationProvider_inject_time)},
- {"native_inject_best_location",
- "(IDDDFFFFFFJ)V",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_inject_best_location)},
- {"native_inject_location",
- "(DDF)V",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_inject_location)},
+ {"native_inject_best_location", "(IDDDFFFFFFJIJ)V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_inject_best_location)},
+ {"native_inject_location", "(DDF)V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_inject_location)},
{"native_supports_xtra", "()Z", reinterpret_cast<void *>(
android_location_GnssLocationProvider_supports_xtra)},
- {"native_inject_xtra_data",
- "([BI)V",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_inject_xtra_data)},
- {"native_agps_set_id",
- "(ILjava/lang/String;)V",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_agps_set_id)},
- {"native_agps_set_ref_location_cellid",
- "(IIIII)V",
- reinterpret_cast<void *>(
- android_location_GnssLocationProvider_agps_set_reference_location_cellid)},
- {"native_set_agps_server",
- "(ILjava/lang/String;I)V",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_set_agps_server)},
- {"native_send_ni_response",
- "(II)V",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_send_ni_response)},
- {"native_get_internal_state",
- "()Ljava/lang/String;",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_get_internal_state)},
+ {"native_inject_xtra_data", "([BI)V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_inject_xtra_data)},
+ {"native_agps_set_id", "(ILjava/lang/String;)V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_agps_set_id)},
+ {"native_agps_set_ref_location_cellid", "(IIIII)V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_agps_set_reference_location_cellid)},
+ {"native_set_agps_server", "(ILjava/lang/String;I)V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_set_agps_server)},
+ {"native_send_ni_response", "(II)V", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_send_ni_response)},
+ {"native_get_internal_state", "()Ljava/lang/String;", reinterpret_cast<void *>(
+ android_location_GnssLocationProvider_get_internal_state)},
{"native_is_gnss_visibility_control_supported", "()Z", reinterpret_cast<void *>(
android_location_GnssLocationProvider_is_gnss_visibility_control_supported)},
};