diff options
| -rw-r--r-- | services/core/jni/com_android_server_location_FlpHardwareProvider.cpp | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp index 8ea9bfc04662..06d2031e4a4a 100644 --- a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp +++ b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp @@ -78,7 +78,7 @@ static inline void ThrowOnError( env->ThrowNew(exceptionClass, methodName); } -static bool IsValidCallbackThread() { +static bool IsValidCallbackThreadEnvOnly() { JNIEnv* env = AndroidRuntime::getJNIEnv(); if(sCallbackEnv == NULL || sCallbackEnv != env) { @@ -89,6 +89,20 @@ static bool IsValidCallbackThread() { return true; } +static bool IsValidCallbackThread() { + // sCallbacksObject is created when FlpHardwareProvider on Java side is + // initialized. Sometimes the hardware may call a function before the Java + // side is ready. In order to prevent a system crash, check whether + // sCallbacksObj has been created. If not, simply ignore this event from + // hardware. + if (sCallbacksObj == NULL) { + ALOGE("Attempt to use FlpHardwareProvider blocked, because it hasn't been initialized."); + return false; + } + + return IsValidCallbackThreadEnvOnly(); +} + static void BatchingCapabilitiesCallback(int32_t capabilities) { if(!IsValidCallbackThread()) { return; @@ -154,7 +168,7 @@ static int SetThreadEvent(ThreadEvent event) { } case DISASSOCIATE_JVM: { - if (!IsValidCallbackThread()) { + if (!IsValidCallbackThreadEnvOnly()) { ALOGE( "Attempted to dissasociate an unnownk callback thread : '%s'.", __FUNCTION__ @@ -661,16 +675,6 @@ static void GeofenceMonitorStatusCallback( TranslateToObject(lastLocation, locationObject); } - // sCallbacksObject is created when FlpHardwareProvider on Java side is - // initialized. Sometimes the hardware may call this function before the Java - // side is ready. In order to prevent the system crash, check whether - // sCallbacksObj has been created. If not, simply ignore this event from - // hardware. - if (sCallbacksObj == NULL) { - ALOGE("FlpHardwareProvider hasn't been initialized."); - return; - } - sCallbackEnv->CallVoidMethod( sCallbacksObj, sOnGeofenceMonitorStatus, |