From 47605a92fae2f3ce0886cb68940e38c2f20ba4d4 Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Wed, 4 Jun 2025 18:40:50 +0200 Subject: [PATCH] Make sure AndroidRendererFrontend exists when accessing it (#3522) --- .../src/cpp/android_renderer_frontend.cpp | 23 ++++++++++++++----- .../src/cpp/android_renderer_frontend.hpp | 12 ++++++++-- .../src/cpp/native_map_view.cpp | 2 +- .../src/cpp/native_map_view.hpp | 2 +- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp index 988dff420..6ecc42981 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.cpp @@ -91,13 +91,24 @@ private: ActorRef delegate; }; -AndroidRendererFrontend::AndroidRendererFrontend(MapRenderer& mapRenderer_) +AndroidRendererFrontend::AndroidRendererFrontend(Private, MapRenderer& mapRenderer_) : mapRenderer(mapRenderer_), - mapRunLoop(util::RunLoop::Get()), - updateAsyncTask(std::make_unique([this]() { - mapRenderer.update(std::move(updateParams)); - mapRenderer.requestRender(); - })) {} + mapRunLoop(util::RunLoop::Get()) {} + +std::shared_ptr AndroidRendererFrontend::create(MapRenderer& mapRenderer) { + auto ptr = std::make_shared(Private(), mapRenderer); + ptr->init(); + return ptr; +} + +void AndroidRendererFrontend::init() { + updateAsyncTask = std::make_unique([weakSelf = weak_from_this()]() { + if (auto self = weakSelf.lock()) { + self->mapRenderer.update(std::move(self->updateParams)); + self->mapRenderer.requestRender(); + } + }); +} AndroidRendererFrontend::~AndroidRendererFrontend() = default; diff --git a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp index 2eb325c9c..3210634fa 100644 --- a/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/android_renderer_frontend.hpp @@ -27,9 +27,17 @@ class AsyncTask; namespace android { -class AndroidRendererFrontend : public RendererFrontend { +class AndroidRendererFrontend : public RendererFrontend, public std::enable_shared_from_this { + struct Private { + explicit Private() = default; + }; + public: - AndroidRendererFrontend(MapRenderer&); + AndroidRendererFrontend(Private, MapRenderer&); + + static std::shared_ptr create(MapRenderer&); + void init(); + ~AndroidRendererFrontend() override; void reset() override; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp index 7fccd8814..c62cad5ff 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.cpp @@ -75,7 +75,7 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, } // Create a renderer frontend - rendererFrontend = std::make_unique(mapRenderer); + rendererFrontend = AndroidRendererFrontend::create(mapRenderer); // Create Map options MapOptions options; diff --git a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp index 045b20c57..f9a0c7a3e 100644 --- a/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp +++ b/platform/android/MapLibreAndroid/src/cpp/native_map_view.hpp @@ -345,7 +345,7 @@ public: void onSpriteRequested(const std::optional&) override; private: - std::unique_ptr rendererFrontend; + std::shared_ptr rendererFrontend; JavaVM* vm = nullptr; jni::WeakReference> javaPeer;