diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2018-07-10 16:40:59 +0300 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2018-09-05 16:07:10 +0200 |
commit | b6b75e1699a3aedca58d8cda8b1a0470c7f4984f (patch) | |
tree | 34c8c662764af12febdd8d2ea9dc79e129b2158e | |
parent | 5f35ed111d99b5cc8423491a00623e6a8f3013a1 (diff) | |
download | qtlocation-mapboxgl-b6b75e1699a3aedca58d8cda8b1a0470c7f4984f.tar.gz |
[android] map_renderer_runnable - separate reference accessor and global reference release for gnustl support
-rw-r--r-- | platform/android/src/map_renderer.cpp | 7 | ||||
-rw-r--r-- | platform/android/src/map_renderer_runnable.cpp | 10 | ||||
-rw-r--r-- | platform/android/src/map_renderer_runnable.hpp | 7 |
3 files changed, 17 insertions, 7 deletions
diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp index ba6fdc63b0..aafb638067 100644 --- a/platform/android/src/map_renderer.cpp +++ b/platform/android/src/map_renderer.cpp @@ -48,13 +48,16 @@ void MapRenderer::schedule(std::weak_ptr<Mailbox> scheduled) { android::UniqueEnv _env = android::AttachEnv(); auto runnable = std::make_unique<MapRendererRunnable>(*_env, std::move(scheduled)); - // Obtain ownership of the peer (gets transferred to the MapRenderer on the JVM for later GC) + // Get a reference to the runnable's java peer auto peer = runnable->peer(); // Queue the event on the Java Peer static auto queueEvent = javaClass.GetMethod<void( jni::Object<MapRendererRunnable>)>(*_env, "queueEvent"); - javaPeer->Call(*_env, queueEvent, *peer); + javaPeer->Call(*_env, queueEvent, peer); + + // Release the java peer as it is now owned by the MapRenderer java GC root + runnable->releasePeer(); // Release the c++ peer as it will be destroyed on GC of the Java Peer runnable.release(); diff --git a/platform/android/src/map_renderer_runnable.cpp b/platform/android/src/map_renderer_runnable.cpp index 4dc6611c40..815d65fa59 100644 --- a/platform/android/src/map_renderer_runnable.cpp +++ b/platform/android/src/map_renderer_runnable.cpp @@ -9,7 +9,7 @@ MapRendererRunnable::MapRendererRunnable(jni::JNIEnv& env, std::weak_ptr<Mailbox : mailbox(std::move(mailbox_)) { // Create the Java peer and hold on to a global reference - // Not using a weak reference here as this might oerflow + // Not using a weak reference here as this might overflow // the weak reference table on some devices jni::UniqueLocalFrame frame = jni::PushLocalFrame(env, 5); static auto constructor = javaClass.GetConstructor<jlong>(env); @@ -23,8 +23,12 @@ void MapRendererRunnable::run(jni::JNIEnv&) { Mailbox::maybeReceive(mailbox); } -jni::UniqueObject<MapRendererRunnable> MapRendererRunnable::peer() { - return std::move(javaPeer); +jni::Object<MapRendererRunnable> MapRendererRunnable::peer() { + return jni::Object<MapRendererRunnable>(*javaPeer); +} + +void MapRendererRunnable::releasePeer() { + javaPeer.reset(); } // Static methods // diff --git a/platform/android/src/map_renderer_runnable.hpp b/platform/android/src/map_renderer_runnable.hpp index 46fb028d26..9614bfd4e6 100644 --- a/platform/android/src/map_renderer_runnable.hpp +++ b/platform/android/src/map_renderer_runnable.hpp @@ -37,8 +37,11 @@ public: void run(jni::JNIEnv&); - // Transfers ownership of the Peer object to the caller - jni::UniqueObject<MapRendererRunnable> peer(); + // Get a reference to the Java Peer object + jni::Object<MapRendererRunnable> peer(); + + // Release Java peer + void releasePeer(); private: jni::UniqueObject<MapRendererRunnable> javaPeer; |