From e94a7fc40551d4673fd885cbcad1c41706af26b0 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Wed, 12 Dec 2018 10:25:15 +0100 Subject: [android] - validate if weakreference is still valid --- platform/android/src/native_map_view.cpp | 63 ++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 12 deletions(-) (limited to 'platform') diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 5b23076441..872022c8e4 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -101,16 +101,23 @@ void NativeMapView::onCameraWillChange(MapObserver::CameraChangeMode mode) { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onCameraWillChange = javaClass.GetMethod(*_env, "onCameraWillChange"); - javaPeer.get(*_env).Call(*_env, onCameraWillChange, (jboolean) (mode != MapObserver::CameraChangeMode::Immediate)); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onCameraWillChange, (jboolean) (mode != MapObserver::CameraChangeMode::Immediate)); + } } + void NativeMapView::onCameraIsChanging() { assert(vm != nullptr); android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onCameraIsChanging = javaClass.GetMethod(*_env, "onCameraIsChanging"); - javaPeer.get(*_env).Call(*_env, onCameraIsChanging); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onCameraIsChanging); + } } void NativeMapView::onCameraDidChange(MapObserver::CameraChangeMode mode) { @@ -119,7 +126,11 @@ void NativeMapView::onCameraDidChange(MapObserver::CameraChangeMode mode) { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onCameraDidChange = javaClass.GetMethod(*_env, "onCameraDidChange"); - javaPeer.get(*_env).Call(*_env, onCameraDidChange, (jboolean) (mode != MapObserver::CameraChangeMode::Immediate)); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onCameraDidChange, + (jboolean) (mode != MapObserver::CameraChangeMode::Immediate)); + } } void NativeMapView::onWillStartLoadingMap() { @@ -128,7 +139,10 @@ void NativeMapView::onWillStartLoadingMap() { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onWillStartLoadingMap = javaClass.GetMethod(*_env, "onWillStartLoadingMap"); - javaPeer.get(*_env).Call(*_env, onWillStartLoadingMap); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onWillStartLoadingMap); + } } void NativeMapView::onDidFinishLoadingMap() { @@ -137,7 +151,11 @@ void NativeMapView::onDidFinishLoadingMap() { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onDidFinishLoadingMap = javaClass.GetMethod(*_env, "onDidFinishLoadingMap"); - javaPeer.get(*_env).Call(*_env, onDidFinishLoadingMap);} + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onDidFinishLoadingMap); + } +} void NativeMapView::onDidFailLoadingMap(std::exception_ptr exceptionPtr) { assert(vm != nullptr); @@ -146,7 +164,10 @@ void NativeMapView::onDidFailLoadingMap(std::exception_ptr exceptionPtr) { static auto& javaClass = jni::Class::Singleton(*_env); static auto onDidFailLoadingMap = javaClass.GetMethod(*_env, "onDidFailLoadingMap"); std::string error = mbgl::util::toString(exceptionPtr); - javaPeer.get(*_env).Call(*_env, onDidFailLoadingMap, jni::Make(*_env, error)); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onDidFailLoadingMap, jni::Make(*_env, error)); + } } void NativeMapView::onWillStartRenderingFrame() { @@ -155,7 +176,10 @@ void NativeMapView::onWillStartRenderingFrame() { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onWillStartRenderingFrame = javaClass.GetMethod(*_env, "onWillStartRenderingFrame"); - javaPeer.get(*_env).Call(*_env, onWillStartRenderingFrame); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onWillStartRenderingFrame); + } } void NativeMapView::onDidFinishRenderingFrame(MapObserver::RenderMode mode) { @@ -164,7 +188,10 @@ void NativeMapView::onDidFinishRenderingFrame(MapObserver::RenderMode mode) { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onDidFinishRenderingFrame = javaClass.GetMethod(*_env, "onDidFinishRenderingFrame"); - javaPeer.get(*_env).Call(*_env, onDidFinishRenderingFrame, (jboolean) (mode != MapObserver::RenderMode::Partial)); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onDidFinishRenderingFrame, (jboolean) (mode != MapObserver::RenderMode::Partial)); + } } @@ -174,7 +201,10 @@ void NativeMapView::onWillStartRenderingMap() { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onWillStartRenderingMap = javaClass.GetMethod(*_env, "onWillStartRenderingMap"); - javaPeer.get(*_env).Call(*_env, onWillStartRenderingMap); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onWillStartRenderingMap); + } } void NativeMapView::onDidFinishRenderingMap(MapObserver::RenderMode mode) { @@ -183,7 +213,10 @@ void NativeMapView::onDidFinishRenderingMap(MapObserver::RenderMode mode) { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onDidFinishRenderingMap = javaClass.GetMethod(*_env, "onDidFinishRenderingMap"); - javaPeer.get(*_env).Call(*_env, onDidFinishRenderingMap, (jboolean) (mode != MapObserver::RenderMode::Partial)); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onDidFinishRenderingMap, (jboolean) (mode != MapObserver::RenderMode::Partial)); + } } void NativeMapView::onDidBecomeIdle() { @@ -201,7 +234,10 @@ void NativeMapView::onDidFinishLoadingStyle() { android::UniqueEnv _env = android::AttachEnv(); static auto& javaClass = jni::Class::Singleton(*_env); static auto onDidFinishLoadingStyle = javaClass.GetMethod(*_env, "onDidFinishLoadingStyle"); - javaPeer.get(*_env).Call(*_env, onDidFinishLoadingStyle); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onDidFinishLoadingStyle); + } } void NativeMapView::onSourceChanged(mbgl::style::Source& source) { @@ -211,7 +247,10 @@ void NativeMapView::onSourceChanged(mbgl::style::Source& source) { static auto& javaClass = jni::Class::Singleton(*_env); static auto onSourceChanged = javaClass.GetMethod(*_env, "onSourceChanged"); auto sourceId = jni::Make(*_env, source.getID()); - javaPeer.get(*_env).Call(*_env, onSourceChanged, sourceId); + auto weakReference = javaPeer.get(*_env); + if (weakReference) { + weakReference.Call(*_env, onSourceChanged, sourceId); + } } // JNI Methods // -- cgit v1.2.1