diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-03-04 18:32:55 -0800 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-03-07 09:31:16 -0800 |
commit | b318903ab96f80de4e73dbbffb0f19be028b44ff (patch) | |
tree | ecfcf30621a06622cda8073baea7f13adbb09a91 /platform | |
parent | c8b100ffe41092742bf2529f0e2e70cf184cab65 (diff) | |
download | qtlocation-mapboxgl-b318903ab96f80de4e73dbbffb0f19be028b44ff.tar.gz |
[android] Don't crash if someone tries to use OfflineRegion after delete
Diffstat (limited to 'platform')
-rwxr-xr-x | platform/android/src/jni.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 7d2ae1f9cc..237fbb99da 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -1469,6 +1469,15 @@ void setOfflineMapboxTileCountLimit(JNIEnv *env, jni::jobject* obj, jlong defaul defaultFileSource->setOfflineMapboxTileCountLimit(limit); } +mbgl::OfflineRegion* getOfflineRegionPeer(JNIEnv *env, jni::jobject* offlineRegion_) { + jlong offlineRegionPtr = jni::GetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId); + if (!offlineRegionPtr) { + jni::ThrowNew(*env, jni::FindClass(*env, "java/lang/IllegalStateException"), + "Use of OfflineRegion after OfflineRegion.delete"); + } + return reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr); +} + void destroyOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_) { mbgl::Log::Debug(mbgl::Event::JNI, "destroyOfflineRegion"); @@ -1494,8 +1503,7 @@ void setOfflineRegionObserver(JNIEnv *env, jni::jobject* offlineRegion_, jni::jo mbgl::Log::Debug(mbgl::Event::JNI, "setOfflineRegionObserver"); // Offline region - jlong offlineRegionPtr = jni::GetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr); + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); // File source jni::jobject* jmanager = jni::GetField<jni::jobject*>(*env, offlineRegion_, *offlineRegionOfflineManagerId); @@ -1617,8 +1625,7 @@ void setOfflineRegionDownloadState(JNIEnv *env, jni::jobject* offlineRegion_, ji } // Offline region - jlong offlineRegionPtr = jni::GetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr); + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); // File source jni::jobject* jmanager = jni::GetField<jni::jobject*>(*env, offlineRegion_, *offlineRegionOfflineManagerId); @@ -1633,8 +1640,7 @@ void getOfflineRegionStatus(JNIEnv *env, jni::jobject* offlineRegion_, jni::jobj mbgl::Log::Debug(mbgl::Event::JNI, "getOfflineRegionStatus"); // Offline region - jlong offlineRegionPtr = jni::GetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr); + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); // File source jni::jobject* jmanager = jni::GetField<jni::jobject*>(*env, offlineRegion_, *offlineRegionOfflineManagerId); @@ -1689,8 +1695,7 @@ void deleteOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_, jni::jobject mbgl::Log::Debug(mbgl::Event::JNI, "deleteOfflineRegion"); // Offline region - jlong offlineRegionPtr = jni::GetField<jlong>(*env, offlineRegion_, *offlineRegionPtrId); - mbgl::OfflineRegion *offlineRegion = reinterpret_cast<mbgl::OfflineRegion *>(offlineRegionPtr); + mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_); // File source jni::jobject* jmanager = jni::GetField<jni::jobject*>(*env, offlineRegion_, *offlineRegionOfflineManagerId); |