diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp index f5336e3dd..3ebbdb7e5 100644 --- a/platform/android/src/map_renderer.cpp +++ b/platform/android/src/map_renderer.cpp @@ -17,10 +17,21 @@ MapRenderer::MapRenderer(jni::JNIEnv& _env, const jni::Object& obj, jni::jfloat pixelRatio_, const jni::String& localIdeographFontFamily_) - : javaPeer(_env, obj) - , pixelRatio(pixelRatio_) - , localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make(_env, localIdeographFontFamily_) : optional{}) - , mailbox(std::make_shared(*this)) { + : javaPeer(_env, obj), + pixelRatio(pixelRatio_), + localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make(_env, localIdeographFontFamily_) + : optional{}), + mailboxData(this) {} + +MapRenderer::MailboxData::MailboxData(Scheduler* scheduler_) : scheduler(scheduler_) { + assert(scheduler); +} + +std::shared_ptr MapRenderer::MailboxData::getMailbox() const noexcept { + if (!mailbox) { + mailbox = std::make_shared(*scheduler); + } + return mailbox; } MapRenderer::~MapRenderer() = default; @@ -30,7 +41,7 @@ void MapRenderer::reset() { if (renderer) { // Make sure to destroy the renderer on the GL Thread - auto self = ActorRef(*this, mailbox); + auto self = ActorRef(*this, mailboxData.getMailbox()); self.ask(&MapRenderer::resetRenderer).wait(); } @@ -93,7 +104,7 @@ void MapRenderer::setObserver(std::shared_ptr _rendererObserve } void MapRenderer::requestSnapshot(SnapshotCallback callback) { - auto self = ActorRef(*this, mailbox); + auto self = ActorRef(*this, mailboxData.getMailbox()); self.invoke( &MapRenderer::scheduleSnapshot, std::make_unique([&, callback=std::move(callback), runloop=util::RunLoop::Get()](PremultipliedImage image) { @@ -172,7 +183,7 @@ void MapRenderer::onSurfaceCreated(JNIEnv&) { // Create the new backend and renderer backend = std::make_unique(); renderer = std::make_unique(*backend, pixelRatio, localIdeographFontFamily); - rendererRef = std::make_unique>(*renderer, mailbox); + rendererRef = std::make_unique>(*renderer, mailboxData.getMailbox()); // Set the observer on the new Renderer implementation if (rendererObserver) { @@ -193,7 +204,7 @@ void MapRenderer::onSurfaceChanged(JNIEnv& env, jint width, jint height) { void MapRenderer::onRendererReset(JNIEnv&) { // Make sure to destroy the renderer on the GL Thread - auto self = ActorRef(*this, mailbox); + auto self = ActorRef(*this, mailboxData.getMailbox()); self.ask(&MapRenderer::resetRenderer).wait(); } diff --git a/platform/android/src/map_renderer.hpp b/platform/android/src/map_renderer.hpp index 047f1870c..e37d37cfc 100644 --- a/platform/android/src/map_renderer.hpp +++ b/platform/android/src/map_renderer.hpp @@ -82,6 +82,14 @@ protected: void scheduleSnapshot(std::unique_ptr); private: + struct MailboxData { + explicit MailboxData(Scheduler*); + std::shared_ptr getMailbox() const noexcept; + + private: + Scheduler* scheduler; + mutable std::shared_ptr mailbox; + }; // Called from the GL Thread // // Resets the renderer @@ -107,7 +115,7 @@ private: optional localIdeographFontFamily; std::shared_ptr threadPool; - std::shared_ptr mailbox; + const MailboxData mailboxData; std::mutex initialisationMutex; std::shared_ptr rendererObserver;