summaryrefslogtreecommitdiff
path: root/platform/android/src/style/sources/custom_geometry_source.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/style/sources/custom_geometry_source.cpp')
-rw-r--r--platform/android/src/style/sources/custom_geometry_source.cpp39
1 files changed, 38 insertions, 1 deletions
diff --git a/platform/android/src/style/sources/custom_geometry_source.cpp b/platform/android/src/style/sources/custom_geometry_source.cpp
index b38405a3b1..9c51f70ab5 100644
--- a/platform/android/src/style/sources/custom_geometry_source.cpp
+++ b/platform/android/src/style/sources/custom_geometry_source.cpp
@@ -54,7 +54,9 @@ namespace android {
: Source(env, coreSource, createJavaPeer(env), frontend) {
}
- CustomGeometrySource::~CustomGeometrySource() = default;
+ CustomGeometrySource::~CustomGeometrySource() {
+ releaseThreads();
+ }
void CustomGeometrySource::fetchTile (const mbgl::CanonicalTileID& tileID) {
android::UniqueEnv _env = android::AttachEnv();
@@ -78,6 +80,28 @@ namespace android {
peer.Call(*_env, cancelTile, (int)tileID.z, (int)tileID.x, (int)tileID.y);
};
+ void CustomGeometrySource::startThreads() {
+ android::UniqueEnv _env = android::AttachEnv();
+
+ static auto startThreads = javaClass.GetMethod<void ()>(*_env, "startThreads");
+
+ assert(javaPeer);
+
+ auto peer = jni::Cast(*_env, *javaPeer, javaClass);
+ peer.Call(*_env, startThreads);
+ }
+
+ void CustomGeometrySource::releaseThreads() {
+ android::UniqueEnv _env = android::AttachEnv();
+
+ static auto releaseThreads = javaClass.GetMethod<void ()>(*_env, "releaseThreads");
+
+ assert(javaPeer);
+
+ auto peer = jni::Cast(*_env, *javaPeer, javaClass);
+ peer.Call(*_env, releaseThreads);
+ };
+
void CustomGeometrySource::setTileData(jni::JNIEnv& env,
jni::jint z,
jni::jint x,
@@ -120,6 +144,19 @@ namespace android {
return jni::Object<Source>(CustomGeometrySource::javaClass.New(env, constructor, reinterpret_cast<jni::jlong>(this)).Get());
}
+ void CustomGeometrySource::addToMap(JNIEnv& env, jni::Object<Source> obj, mbgl::Map& map, AndroidRendererFrontend& frontend) {
+ Source::addToMap(env, obj, map, frontend);
+ startThreads();
+ }
+
+ bool CustomGeometrySource::removeFromMap(JNIEnv& env, jni::Object<Source> source, mbgl::Map& map) {
+ bool successfullyRemoved = Source::removeFromMap(env, source, map);
+ if (successfullyRemoved) {
+ releaseThreads();
+ }
+ return successfullyRemoved;
+ }
+
void CustomGeometrySource::registerNative(jni::JNIEnv& env) {
// Lookup the class
CustomGeometrySource::javaClass = *jni::Class<CustomGeometrySource>::Find(env).NewGlobalRef(env).release();