diff options
| author | 2019-05-02 22:07:47 +0000 | |
|---|---|---|
| committer | 2019-05-02 22:07:47 +0000 | |
| commit | fc0abbf01d60dc3b3b4f293405bfaeed0ecea534 (patch) | |
| tree | edaf74d360a471f9e4229deb8b56b4d170db211f | |
| parent | 330279c7f14ac5cd0d6035944adc428b36811029 (diff) | |
| parent | 1a78945f6abe4316829933d45f0c1832d6cf84ac (diff) | |
Merge "Cache java classes and methods look-ups in GnssLocationProvider JNI" into qt-dev
| -rw-r--r-- | services/core/jni/com_android_server_location_GnssLocationProvider.cpp | 112 |
1 files changed, 67 insertions, 45 deletions
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 4d37f1ace9c0..98c620c50f54 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -45,6 +45,13 @@ #include <string.h> #include <utils/SystemClock.h> +static jclass class_gnssMeasurementsEvent; +static jclass class_gnssMeasurement; +static jclass class_location; +static jclass class_gnssNavigationMessage; +static jclass class_gnssClock; +static jclass class_gnssConfiguration_halInterfaceVersion; + static jobject mCallbacksObj = nullptr; static jmethodID method_reportLocation; @@ -95,6 +102,12 @@ static jmethodID method_correctionPlaneAltDeg; static jmethodID method_correctionPlaneAzimDeg; static jmethodID method_reportNfwNotification; static jmethodID method_isInEmergencySession; +static jmethodID method_gnssMeasurementsEventCtor; +static jmethodID method_locationCtor; +static jmethodID method_gnssNavigationMessageCtor; +static jmethodID method_gnssClockCtor; +static jmethodID method_gnssMeasurementCtor; +static jmethodID method_halInterfaceVersionCtor; /* * Save a pointer to JavaVm to attach/detach threads executing @@ -255,11 +268,11 @@ void JavaMethodHelper<T>::callJavaMethod( 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); + JavaObject(JNIEnv* env, jclass clazz, jmethodID defaultCtor); + JavaObject(JNIEnv* env, jclass clazz, jmethodID stringCtor, const char * sz_arg_1); + JavaObject(JNIEnv* env, jclass clazz, jobject object); - virtual ~JavaObject(); + virtual ~JavaObject() = default; template<class T> void callSetter(const char* method_name, T value); @@ -273,25 +286,20 @@ class JavaObject { jobject object_; }; -JavaObject::JavaObject(JNIEnv* env, const char* class_name) : env_(env) { - clazz_ = env_->FindClass(class_name); - jmethodID ctor = env->GetMethodID(clazz_, "<init>", "()V"); - object_ = env_->NewObject(clazz_, ctor); +JavaObject::JavaObject(JNIEnv* env, jclass clazz, jmethodID defaultCtor) : env_(env), + clazz_(clazz) { + object_ = env_->NewObject(clazz_, defaultCtor); } -JavaObject::JavaObject(JNIEnv* env, const char* class_name, const char * sz_arg_1) : env_(env) { - clazz_ = env_->FindClass(class_name); - jmethodID ctor = env->GetMethodID(clazz_, "<init>", "(Ljava/lang/String;)V"); - 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(JNIEnv* env, jclass clazz, jmethodID stringCtor, const char * sz_arg_1) + : env_(env), clazz_(clazz) { + object_ = env_->NewObject(clazz_, stringCtor, env->NewStringUTF(sz_arg_1)); } -JavaObject::~JavaObject() { - env_->DeleteLocalRef(clazz_); + +JavaObject::JavaObject(JNIEnv* env, jclass clazz, jobject object) + : env_(env), clazz_(clazz), object_(object) { } template<class T> @@ -358,11 +366,8 @@ static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodNa } static jobject createHalInterfaceVersionJavaObject(JNIEnv* env, jint major, jint minor) { - jclass versionClass = - env->FindClass("com/android/server/location/GnssConfiguration$HalInterfaceVersion"); - jmethodID versionCtor = env->GetMethodID(versionClass, "<init>", "(II)V"); - jobject version = env->NewObject(versionClass, versionCtor, major, minor); - env->DeleteLocalRef(versionClass); + jobject version = env->NewObject(class_gnssConfiguration_halInterfaceVersion, + method_halInterfaceVersionCtor, major, minor); return version; } @@ -452,7 +457,7 @@ static JNIEnv* getJniEnv() { static jobject translateGnssLocation(JNIEnv* env, const GnssLocation_V1_0& location) { - JavaObject object(env, "android/location/Location", "gps"); + JavaObject object(env, class_location, method_locationCtor, "gps"); uint16_t flags = static_cast<uint32_t>(location.gnssLocationFlags); if (flags & GnssLocationFlags::HAS_LAT_LONG) { @@ -488,8 +493,7 @@ static jobject translateGnssLocation(JNIEnv* env, static jobject translateGnssLocation(JNIEnv* env, const GnssLocation_V2_0& location) { - JavaObject object(env, "android/location/Location", - translateGnssLocation(env, location.v1_0)); + JavaObject object(env, class_location, translateGnssLocation(env, location.v1_0)); const uint16_t flags = static_cast<uint16_t>(location.elapsedRealtime.flags); @@ -946,7 +950,7 @@ Return<void> GnssNavigationMessageCallback::gnssNavigationMessageCb( return Void(); } - JavaObject object(env, "android/location/GnssNavigationMessage"); + JavaObject object(env, class_gnssNavigationMessage, method_gnssNavigationMessageCtor); SET(Type, static_cast<int32_t>(message.type)); SET(Svid, static_cast<int32_t>(message.svid)); SET(MessageId, static_cast<int32_t>(message.messageId)); @@ -1013,7 +1017,7 @@ template<class T> void GnssMeasurementCallback::translateAndSetGnssData(const T& data) { JNIEnv* env = getJniEnv(); - JavaObject gnssClockJavaObject(env, "android/location/GnssClock"); + JavaObject gnssClockJavaObject(env, class_gnssClock, method_gnssClockCtor); translateGnssClock(gnssClockJavaObject, data); jobject clock = gnssClockJavaObject.get(); @@ -1175,41 +1179,30 @@ jobjectArray GnssMeasurementCallback::translateAllGnssMeasurements(JNIEnv* env, return nullptr; } - jclass gnssMeasurementClass = env->FindClass("android/location/GnssMeasurement"); jobjectArray gnssMeasurementArray = env->NewObjectArray( count, - gnssMeasurementClass, + class_gnssMeasurement, nullptr /* initialElement */); for (uint16_t i = 0; i < count; ++i) { - JavaObject object(env, "android/location/GnssMeasurement"); + JavaObject object(env, class_gnssMeasurement, method_gnssMeasurementCtor); translateSingleGnssMeasurement(&(measurements[i]), object); env->SetObjectArrayElement(gnssMeasurementArray, i, object.get()); } - env->DeleteLocalRef(gnssMeasurementClass); return gnssMeasurementArray; } void GnssMeasurementCallback::setMeasurementData(JNIEnv* env, jobject clock, jobjectArray measurementArray) { - jclass gnssMeasurementsEventClass = - env->FindClass("android/location/GnssMeasurementsEvent"); - jmethodID gnssMeasurementsEventCtor = - env->GetMethodID( - gnssMeasurementsEventClass, - "<init>", - "(Landroid/location/GnssClock;[Landroid/location/GnssMeasurement;)V"); - - jobject gnssMeasurementsEvent = env->NewObject(gnssMeasurementsEventClass, - gnssMeasurementsEventCtor, + jobject gnssMeasurementsEvent = env->NewObject(class_gnssMeasurementsEvent, + method_gnssMeasurementsEventCtor, clock, measurementArray); env->CallVoidMethod(mCallbacksObj, method_reportMeasurementData, gnssMeasurementsEvent); checkAndClearExceptionFromCallback(env, __FUNCTION__); - env->DeleteLocalRef(gnssMeasurementsEventClass); env->DeleteLocalRef(gnssMeasurementsEvent); } @@ -1464,8 +1457,7 @@ template<class T> Return<void> GnssBatchingCallbackUtil::gnssLocationBatchCbImpl(const hidl_vec<T>& locations) { JNIEnv* env = getJniEnv(); - jobjectArray jLocations = env->NewObjectArray(locations.size(), - env->FindClass("android/location/Location"), nullptr); + jobjectArray jLocations = env->NewObjectArray(locations.size(), class_location, nullptr); for (uint16_t i = 0; i < locations.size(); ++i) { jobject jLocation = translateGnssLocation(env, locations[i]); @@ -1617,6 +1609,36 @@ static void android_location_GnssLocationProvider_init_once(JNIEnv* env, jclass method_correctionPlaneAltDeg = env->GetMethodID(refPlaneClass, "getAltitudeMeters", "()D"); method_correctionPlaneAzimDeg = env->GetMethodID(refPlaneClass, "getAzimuthDegrees", "()D"); + jclass gnssMeasurementsEventClass = env->FindClass("android/location/GnssMeasurementsEvent"); + class_gnssMeasurementsEvent= (jclass) env->NewGlobalRef(gnssMeasurementsEventClass); + method_gnssMeasurementsEventCtor = env->GetMethodID( + class_gnssMeasurementsEvent, + "<init>", + "(Landroid/location/GnssClock;[Landroid/location/GnssMeasurement;)V"); + + jclass gnssMeasurementClass = env->FindClass("android/location/GnssMeasurement"); + class_gnssMeasurement = (jclass) env->NewGlobalRef(gnssMeasurementClass); + method_gnssMeasurementCtor = env->GetMethodID(class_gnssMeasurement, "<init>", "()V"); + + jclass locationClass = env->FindClass("android/location/Location"); + class_location = (jclass) env->NewGlobalRef(locationClass); + method_locationCtor = env->GetMethodID(class_location, "<init>", "(Ljava/lang/String;)V"); + + jclass gnssNavigationMessageClass = env->FindClass("android/location/GnssNavigationMessage"); + class_gnssNavigationMessage = (jclass) env->NewGlobalRef(gnssNavigationMessageClass); + method_gnssNavigationMessageCtor = env->GetMethodID(class_gnssNavigationMessage, "<init>", "()V"); + + jclass gnssClockClass = env->FindClass("android/location/GnssClock"); + class_gnssClock = (jclass) env->NewGlobalRef(gnssClockClass); + method_gnssClockCtor = env->GetMethodID(class_gnssClock, "<init>", "()V"); + + jclass gnssConfiguration_halInterfaceVersionClass = + env->FindClass("com/android/server/location/GnssConfiguration$HalInterfaceVersion"); + class_gnssConfiguration_halInterfaceVersion = + (jclass) env->NewGlobalRef(gnssConfiguration_halInterfaceVersionClass); + method_halInterfaceVersionCtor = + env->GetMethodID(class_gnssConfiguration_halInterfaceVersion, "<init>", "(II)V"); + /* * Save a pointer to JVM. */ |