diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-03-04 17:49:28 -0800 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-03-07 09:31:16 -0800 |
commit | 6aa8be56f6847450aab2a76a1d03da985df20638 (patch) | |
tree | 4125e456a3ffebd1eda5d9da5e9cff1336a8ee94 /platform/android/src/jni.cpp | |
parent | 0386aeea229ff29d5b63c9aa7614afeae1006548 (diff) | |
download | qtlocation-mapboxgl-6aa8be56f6847450aab2a76a1d03da985df20638.tar.gz |
[android] destroyOfflineRegion must not delete an already-deleted peer
Diffstat (limited to 'platform/android/src/jni.cpp')
-rwxr-xr-x | platform/android/src/jni.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 1d8b1fe175..fcf1b48622 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -1474,16 +1474,18 @@ void destroyOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_, jlong) { // Offline region jlong offlineRegionPtr = jni::GetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr); + if (!offlineRegionPtr) { + return; // Already deleted + } // File source jni::jobject* jmanager = jni::GetField<jni::jobject*>(*env, offlineRegion_, *offlineRegionOfflineManagerId); jlong defaultFileSourcePtr = jni::GetField<jlong>(*env, jmanager, *offlineManagerClassPtrId); mbgl::DefaultFileSource *defaultFileSource = reinterpret_cast<mbgl::DefaultFileSource *>(defaultFileSourcePtr); - // Release the observer + // Release the observer and delete the region + mbgl::OfflineRegion *offlineRegion = reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr); defaultFileSource->setOfflineRegionObserver(*offlineRegion, nullptr); - delete offlineRegion; } @@ -1698,6 +1700,7 @@ void deleteOfflineRegion(JNIEnv *env, jni::jobject* obj, jni::jobject* offlineRe deleteCallback = jni::NewGlobalRef(*env, deleteCallback).release(); // Set new state + jni::SetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId, 0); defaultFileSource->deleteOfflineRegion(std::move(*offlineRegion), [deleteCallback](std::exception_ptr error) mutable { // Reattach, the callback comes from a different thread |