summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-03-04 17:49:28 -0800
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-03-07 09:31:16 -0800
commit6aa8be56f6847450aab2a76a1d03da985df20638 (patch)
tree4125e456a3ffebd1eda5d9da5e9cff1336a8ee94
parent0386aeea229ff29d5b63c9aa7614afeae1006548 (diff)
downloadqtlocation-mapboxgl-6aa8be56f6847450aab2a76a1d03da985df20638.tar.gz
[android] destroyOfflineRegion must not delete an already-deleted peer
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java2
-rwxr-xr-xplatform/android/src/jni.cpp9
2 files changed, 8 insertions, 3 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java
index 0f05549338..d3100b3424 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/offline/OfflineRegion.java
@@ -222,6 +222,8 @@ public class OfflineRegion {
*
* When the operation is complete or encounters an error, the given callback will be
* executed on the main thread.
+ *
+ * After you call this method, you may not call any additional methods on this object.
*/
public void delete(@NonNull final OfflineRegionDeleteCallback callback) {
deleteOfflineRegion(this, new OfflineRegionDeleteCallback() {
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