Fix leaks of JNI objects in the local reference table

Change-Id: I769502f8b13e0025707abdf98c24f2cac0604602
diff --git a/services/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/jni/com_android_server_location_FlpHardwareProvider.cpp
index 9465a68..b403ee6 100644
--- a/services/jni/com_android_server_location_FlpHardwareProvider.cpp
+++ b/services/jni/com_android_server_location_FlpHardwareProvider.cpp
@@ -217,6 +217,8 @@
   }
 
   // TODO: wire sources_used if Location class exposes them
+
+  env->DeleteLocalRef(locationClass);
 }
 
 /*
@@ -257,6 +259,8 @@
 
   jmethodID getFlags = env->GetMethodID(batchOptionsClass, "getFlags", "()I");
   batchOptions.flags = env->CallIntMethod(batchOptionsObject, getFlags);
+
+  env->DeleteLocalRef(batchOptionsClass);
 }
 
 /*
@@ -326,6 +330,8 @@
   options->last_transition = env->CallIntMethod(geofenceRequestObject, getLastTransition);
 
   // TODO: set data.sources_to_use when available
+
+  env->DeleteLocalRef(geofenceRequestClass);
 }
 
 /*
@@ -408,6 +414,8 @@
   }
 
   // TODO: wire FlpLocation::sources_used when needed
+
+  sCallbackEnv->DeleteLocalRef(locationClass);
 }
 
 /*
@@ -430,6 +438,8 @@
     sCallbackEnv->SetObjectArrayElement(locationsArray, i, locationObject);
     sCallbackEnv->DeleteLocalRef(locationObject);
   }
+
+  sCallbackEnv->DeleteLocalRef(locationClass);
 }
 
 static void LocationCallback(int32_t locationsCount, FlpLocation** locations) {
@@ -455,6 +465,10 @@
       locationsArray
       );
   CheckExceptions(sCallbackEnv, __FUNCTION__);
+
+  if(locationsArray != NULL) {
+    sCallbackEnv->DeleteLocalRef(locationsArray);
+  }
 }
 
 static void AcquireWakelock() {
@@ -522,6 +536,10 @@
       sourcesUsed
       );
   CheckExceptions(sCallbackEnv, __FUNCTION__);
+
+  if(locationObject != NULL) {
+    sCallbackEnv->DeleteLocalRef(locationObject);
+  }
 }
 
 static void GeofenceMonitorStatusCallback(
@@ -545,6 +563,10 @@
       locationObject
       );
   CheckExceptions(sCallbackEnv, __FUNCTION__);
+
+  if(locationObject != NULL) {
+    sCallbackEnv->DeleteLocalRef(locationObject);
+  }
 }
 
 static void GeofenceAddCallback(int32_t geofenceId, int32_t result) {
@@ -843,6 +865,7 @@
     jobject geofenceObject = env->GetObjectArrayElement(geofenceRequestsArray, i);
 
     TranslateGeofenceFromGeofenceHardwareRequestParcelable(env, geofenceObject, geofences[i]);
+    env->DeleteLocalRef(geofenceObject);
   }
 
   sFlpGeofencingInterface->add_geofences(geofenceRequestsCount, &geofences);