summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2018-07-10 16:40:59 +0300
committerKonstantin Käfer <mail@kkaefer.com>2018-09-05 16:07:10 +0200
commitb6b75e1699a3aedca58d8cda8b1a0470c7f4984f (patch)
tree34c8c662764af12febdd8d2ea9dc79e129b2158e
parent5f35ed111d99b5cc8423491a00623e6a8f3013a1 (diff)
downloadqtlocation-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.cpp7
-rw-r--r--platform/android/src/map_renderer_runnable.cpp10
-rw-r--r--platform/android/src/map_renderer_runnable.hpp7
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;