From 609cdb0fd7b569dade2c3148f21024f280636154 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 28 Feb 2017 02:45:13 +0200 Subject: [android] fix ownership of style layer after delete --- .../android/src/style/layers/background_layer.cpp | 13 ++++++ .../android/src/style/layers/background_layer.hpp | 2 + platform/android/src/style/layers/circle_layer.cpp | 13 ++++++ platform/android/src/style/layers/circle_layer.hpp | 2 + platform/android/src/style/layers/fill_layer.cpp | 13 ++++++ platform/android/src/style/layers/fill_layer.hpp | 2 + platform/android/src/style/layers/layer.cpp | 13 ++++++ platform/android/src/style/layers/layer.cpp.ejs | 16 +++++++ platform/android/src/style/layers/layer.hpp | 7 ++- platform/android/src/style/layers/layer.hpp.ejs | 2 + platform/android/src/style/layers/layers.cpp | 53 +++++++++++++++++----- platform/android/src/style/layers/layers.hpp | 10 +++- platform/android/src/style/layers/line_layer.cpp | 13 ++++++ platform/android/src/style/layers/line_layer.hpp | 2 + platform/android/src/style/layers/raster_layer.cpp | 13 ++++++ platform/android/src/style/layers/raster_layer.hpp | 2 + platform/android/src/style/layers/symbol_layer.cpp | 13 ++++++ platform/android/src/style/layers/symbol_layer.hpp | 2 + 18 files changed, 176 insertions(+), 15 deletions(-) (limited to 'platform/android/src/style/layers') diff --git a/platform/android/src/style/layers/background_layer.cpp b/platform/android/src/style/layers/background_layer.cpp index 6b013ae086..9915f3894e 100644 --- a/platform/android/src/style/layers/background_layer.cpp +++ b/platform/android/src/style/layers/background_layer.cpp @@ -9,14 +9,27 @@ namespace mbgl { namespace android { + /** + * Creates an owning peer object (for layers not attached to the map) from the JVM side + */ BackgroundLayer::BackgroundLayer(jni::JNIEnv& env, jni::String layerId) : Layer(env, std::make_unique(jni::Make(env, layerId))) { } + /** + * Creates a non-owning peer object (for layers currently attached to the map) + */ BackgroundLayer::BackgroundLayer(mbgl::Map& map, mbgl::style::BackgroundLayer& coreLayer) : Layer(map, coreLayer) { } + /** + * Creates an owning peer object (for layers not attached to the map) + */ + BackgroundLayer::BackgroundLayer(mbgl::Map& map, std::unique_ptr coreLayer) + : Layer(map, std::move(coreLayer)) { + } + BackgroundLayer::~BackgroundLayer() = default; // Property getters diff --git a/platform/android/src/style/layers/background_layer.hpp b/platform/android/src/style/layers/background_layer.hpp index bd62c024f4..2fdc948892 100644 --- a/platform/android/src/style/layers/background_layer.hpp +++ b/platform/android/src/style/layers/background_layer.hpp @@ -22,6 +22,8 @@ public: BackgroundLayer(mbgl::Map&, mbgl::style::BackgroundLayer&); + BackgroundLayer(mbgl::Map&, std::unique_ptr); + ~BackgroundLayer(); // Property getters diff --git a/platform/android/src/style/layers/circle_layer.cpp b/platform/android/src/style/layers/circle_layer.cpp index 2b33a2dd47..948c397829 100644 --- a/platform/android/src/style/layers/circle_layer.cpp +++ b/platform/android/src/style/layers/circle_layer.cpp @@ -9,14 +9,27 @@ namespace mbgl { namespace android { + /** + * Creates an owning peer object (for layers not attached to the map) from the JVM side + */ CircleLayer::CircleLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } + /** + * Creates a non-owning peer object (for layers currently attached to the map) + */ CircleLayer::CircleLayer(mbgl::Map& map, mbgl::style::CircleLayer& coreLayer) : Layer(map, coreLayer) { } + /** + * Creates an owning peer object (for layers not attached to the map) + */ + CircleLayer::CircleLayer(mbgl::Map& map, std::unique_ptr coreLayer) + : Layer(map, std::move(coreLayer)) { + } + CircleLayer::~CircleLayer() = default; // Property getters diff --git a/platform/android/src/style/layers/circle_layer.hpp b/platform/android/src/style/layers/circle_layer.hpp index d45984f23b..ee988d7c57 100644 --- a/platform/android/src/style/layers/circle_layer.hpp +++ b/platform/android/src/style/layers/circle_layer.hpp @@ -22,6 +22,8 @@ public: CircleLayer(mbgl::Map&, mbgl::style::CircleLayer&); + CircleLayer(mbgl::Map&, std::unique_ptr); + ~CircleLayer(); // Property getters diff --git a/platform/android/src/style/layers/fill_layer.cpp b/platform/android/src/style/layers/fill_layer.cpp index d818314f89..fc1dfccfcc 100644 --- a/platform/android/src/style/layers/fill_layer.cpp +++ b/platform/android/src/style/layers/fill_layer.cpp @@ -9,14 +9,27 @@ namespace mbgl { namespace android { + /** + * Creates an owning peer object (for layers not attached to the map) from the JVM side + */ FillLayer::FillLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } + /** + * Creates a non-owning peer object (for layers currently attached to the map) + */ FillLayer::FillLayer(mbgl::Map& map, mbgl::style::FillLayer& coreLayer) : Layer(map, coreLayer) { } + /** + * Creates an owning peer object (for layers not attached to the map) + */ + FillLayer::FillLayer(mbgl::Map& map, std::unique_ptr coreLayer) + : Layer(map, std::move(coreLayer)) { + } + FillLayer::~FillLayer() = default; // Property getters diff --git a/platform/android/src/style/layers/fill_layer.hpp b/platform/android/src/style/layers/fill_layer.hpp index 7609a5742f..f43c263ab8 100644 --- a/platform/android/src/style/layers/fill_layer.hpp +++ b/platform/android/src/style/layers/fill_layer.hpp @@ -22,6 +22,8 @@ public: FillLayer(mbgl::Map&, mbgl::style::FillLayer&); + FillLayer(mbgl::Map&, std::unique_ptr); + ~FillLayer(); // Property getters diff --git a/platform/android/src/style/layers/layer.cpp b/platform/android/src/style/layers/layer.cpp index bfc09be302..dbf71fd2af 100644 --- a/platform/android/src/style/layers/layer.cpp +++ b/platform/android/src/style/layers/layer.cpp @@ -26,9 +26,22 @@ namespace android { , layer(*ownedLayer) { } + /** + * Takes a non-owning reference. For lookup methods + */ Layer::Layer(mbgl::Map& coreMap, mbgl::style::Layer& coreLayer) : layer(coreLayer) , map(&coreMap) { } + /** + * Takes a owning reference. Ownership is transfered to this peer, eg after removing + * from the map + */ + Layer::Layer(mbgl::Map& coreMap, std::unique_ptr coreLayer) + : ownedLayer(std::move(coreLayer)) + , layer(*ownedLayer) + , map(&coreMap) { + } + Layer::~Layer() { } diff --git a/platform/android/src/style/layers/layer.cpp.ejs b/platform/android/src/style/layers/layer.cpp.ejs index 9a1274965b..5da397d77d 100644 --- a/platform/android/src/style/layers/layer.cpp.ejs +++ b/platform/android/src/style/layers/layer.cpp.ejs @@ -14,18 +14,34 @@ namespace mbgl { namespace android { <% if (type === 'background') { -%> + /** + * Creates an owning peer object (for layers not attached to the map) from the JVM side + */ <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(jni::JNIEnv& env, jni::String layerId) : Layer(env, std::make_uniqueLayer>(jni::Make(env, layerId))) { <% } else { -%> + /** + * Creates an owning peer object (for layers not attached to the map) from the JVM side + */ <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) : Layer(env, std::make_uniqueLayer>(jni::Make(env, layerId), jni::Make(env, sourceId))) { <% } -%> } + /** + * Creates a non-owning peer object (for layers currently attached to the map) + */ <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(mbgl::Map& map, mbgl::style::<%- camelize(type) %>Layer& coreLayer) : Layer(map, coreLayer) { } + /** + * Creates an owning peer object (for layers not attached to the map) + */ + <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(mbgl::Map& map, std::unique_ptrLayer> coreLayer) + : Layer(map, std::move(coreLayer)) { + } + <%- camelize(type) %>Layer::~<%- camelize(type) %>Layer() = default; // Property getters diff --git a/platform/android/src/style/layers/layer.hpp b/platform/android/src/style/layers/layer.hpp index bf07adad67..deea7a6613 100644 --- a/platform/android/src/style/layers/layer.hpp +++ b/platform/android/src/style/layers/layer.hpp @@ -21,10 +21,15 @@ public: static void registerNative(jni::JNIEnv&); /* - * Called when a Java object is created on the c++ side + * Called when a non-owning peer object is created on the c++ side */ Layer(mbgl::Map&, mbgl::style::Layer&); + /* + * Called when a owning peer object is created on the c++ side + */ + Layer(mbgl::Map&, std::unique_ptr); + /* * Called when a Java object was created from the jvm side */ diff --git a/platform/android/src/style/layers/layer.hpp.ejs b/platform/android/src/style/layers/layer.hpp.ejs index 3d715746ff..102efd2d4d 100644 --- a/platform/android/src/style/layers/layer.hpp.ejs +++ b/platform/android/src/style/layers/layer.hpp.ejs @@ -30,6 +30,8 @@ public: <%- camelize(type) %>Layer(mbgl::Map&, mbgl::style::<%- camelize(type) %>Layer&); + <%- camelize(type) %>Layer(mbgl::Map&, std::unique_ptrLayer>); + ~<%- camelize(type) %>Layer(); // Property getters diff --git a/platform/android/src/style/layers/layers.cpp b/platform/android/src/style/layers/layers.cpp index 328ef94ec8..5c6ee1ae8f 100644 --- a/platform/android/src/style/layers/layers.cpp +++ b/platform/android/src/style/layers/layers.cpp @@ -21,36 +21,65 @@ namespace mbgl { namespace android { -Layer* initializeLayerPeer(mbgl::Map& map, mbgl::style::Layer& coreLayer) { - Layer* layer; +static Layer* initializeLayerPeer(mbgl::Map& map, mbgl::style::Layer& coreLayer) { if (coreLayer.is()) { - layer = new BackgroundLayer(map, *coreLayer.as()); + return new BackgroundLayer(map, *coreLayer.as()); } else if (coreLayer.is()) { - layer = new CircleLayer(map, *coreLayer.as()); + return new CircleLayer(map, *coreLayer.as()); } else if (coreLayer.is()) { - layer = new FillLayer(map, *coreLayer.as()); + return new FillLayer(map, *coreLayer.as()); } else if (coreLayer.is()) { - layer = new LineLayer(map, *coreLayer.as()); + return new LineLayer(map, *coreLayer.as()); } else if (coreLayer.is()) { - layer = new RasterLayer(map, *coreLayer.as()); + return new RasterLayer(map, *coreLayer.as()); } else if (coreLayer.is()) { - layer = new SymbolLayer(map, *coreLayer.as()); + return new SymbolLayer(map, *coreLayer.as()); } else if (coreLayer.is()) { - layer = new CustomLayer(map, *coreLayer.as()); + return new CustomLayer(map, *coreLayer.as()); } else { - layer = new UnknownLayer(map, coreLayer); + return new UnknownLayer(map, coreLayer); } +} + +template +static PeerType* createPeer(Map& map, std::unique_ptr layer) { + return new PeerType(map, std::move(std::unique_ptr(layer.release()->as()))); +} - return layer; +static Layer* initializeLayerPeer(Map& map, std::unique_ptr coreLayer) { + if (coreLayer->is()) { + return createPeer(map, std::move(coreLayer)); + } else if (coreLayer->is()) { + return createPeer(map, std::move(coreLayer)); + } else if (coreLayer->is()) { + return createPeer(map, std::move(coreLayer)); + } else if (coreLayer->is()) { + return createPeer(map, std::move(coreLayer)); + } else if (coreLayer->is()) { + return createPeer(map, std::move(coreLayer)); + } else if (coreLayer->is()) { + return createPeer(map, std::move(coreLayer)); + } else if (coreLayer->is()) { + return createPeer(map, std::move(coreLayer)); + } else { + return new UnknownLayer(map, std::move(coreLayer)); + } } -jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& coreLayer) { +jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, Map& map, style::Layer& coreLayer) { std::unique_ptr peerLayer = std::unique_ptr(initializeLayerPeer(map, coreLayer)); jni::jobject* result = peerLayer->createJavaPeer(env); peerLayer.release(); return result; } +jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr coreLayer) { + std::unique_ptr peerLayer = std::unique_ptr(initializeLayerPeer(map, std::move(coreLayer))); + jni::jobject* result = peerLayer->createJavaPeer(env); + peerLayer.release(); + return result; +} + void registerNativeLayers(jni::JNIEnv& env) { Layer::registerNative(env); BackgroundLayer::registerNative(env); diff --git a/platform/android/src/style/layers/layers.hpp b/platform/android/src/style/layers/layers.hpp index 111b521c26..75863a324a 100644 --- a/platform/android/src/style/layers/layers.hpp +++ b/platform/android/src/style/layers/layers.hpp @@ -10,10 +10,16 @@ namespace mbgl { namespace android { -mbgl::android::Layer* initializeLayerPeer(mbgl::Map&, mbgl::style::Layer&); - +/** + * Create a non-owning peer + */ jni::jobject* createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&); +/** + * Create an owning peer + */ +jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr); + void registerNativeLayers(jni::JNIEnv&); } diff --git a/platform/android/src/style/layers/line_layer.cpp b/platform/android/src/style/layers/line_layer.cpp index e53e2060c8..1a3a666a7b 100644 --- a/platform/android/src/style/layers/line_layer.cpp +++ b/platform/android/src/style/layers/line_layer.cpp @@ -9,14 +9,27 @@ namespace mbgl { namespace android { + /** + * Creates an owning peer object (for layers not attached to the map) from the JVM side + */ LineLayer::LineLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } + /** + * Creates a non-owning peer object (for layers currently attached to the map) + */ LineLayer::LineLayer(mbgl::Map& map, mbgl::style::LineLayer& coreLayer) : Layer(map, coreLayer) { } + /** + * Creates an owning peer object (for layers not attached to the map) + */ + LineLayer::LineLayer(mbgl::Map& map, std::unique_ptr coreLayer) + : Layer(map, std::move(coreLayer)) { + } + LineLayer::~LineLayer() = default; // Property getters diff --git a/platform/android/src/style/layers/line_layer.hpp b/platform/android/src/style/layers/line_layer.hpp index e2fc93329e..a79c8b9021 100644 --- a/platform/android/src/style/layers/line_layer.hpp +++ b/platform/android/src/style/layers/line_layer.hpp @@ -22,6 +22,8 @@ public: LineLayer(mbgl::Map&, mbgl::style::LineLayer&); + LineLayer(mbgl::Map&, std::unique_ptr); + ~LineLayer(); // Property getters diff --git a/platform/android/src/style/layers/raster_layer.cpp b/platform/android/src/style/layers/raster_layer.cpp index 69fd634bce..8a324b88f2 100644 --- a/platform/android/src/style/layers/raster_layer.cpp +++ b/platform/android/src/style/layers/raster_layer.cpp @@ -9,14 +9,27 @@ namespace mbgl { namespace android { + /** + * Creates an owning peer object (for layers not attached to the map) from the JVM side + */ RasterLayer::RasterLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } + /** + * Creates a non-owning peer object (for layers currently attached to the map) + */ RasterLayer::RasterLayer(mbgl::Map& map, mbgl::style::RasterLayer& coreLayer) : Layer(map, coreLayer) { } + /** + * Creates an owning peer object (for layers not attached to the map) + */ + RasterLayer::RasterLayer(mbgl::Map& map, std::unique_ptr coreLayer) + : Layer(map, std::move(coreLayer)) { + } + RasterLayer::~RasterLayer() = default; // Property getters diff --git a/platform/android/src/style/layers/raster_layer.hpp b/platform/android/src/style/layers/raster_layer.hpp index 3cc2d96dde..2f5d4f6fcd 100644 --- a/platform/android/src/style/layers/raster_layer.hpp +++ b/platform/android/src/style/layers/raster_layer.hpp @@ -22,6 +22,8 @@ public: RasterLayer(mbgl::Map&, mbgl::style::RasterLayer&); + RasterLayer(mbgl::Map&, std::unique_ptr); + ~RasterLayer(); // Property getters diff --git a/platform/android/src/style/layers/symbol_layer.cpp b/platform/android/src/style/layers/symbol_layer.cpp index 14803ae278..e42eeb4c77 100644 --- a/platform/android/src/style/layers/symbol_layer.cpp +++ b/platform/android/src/style/layers/symbol_layer.cpp @@ -9,14 +9,27 @@ namespace mbgl { namespace android { + /** + * Creates an owning peer object (for layers not attached to the map) from the JVM side + */ SymbolLayer::SymbolLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } + /** + * Creates a non-owning peer object (for layers currently attached to the map) + */ SymbolLayer::SymbolLayer(mbgl::Map& map, mbgl::style::SymbolLayer& coreLayer) : Layer(map, coreLayer) { } + /** + * Creates an owning peer object (for layers not attached to the map) + */ + SymbolLayer::SymbolLayer(mbgl::Map& map, std::unique_ptr coreLayer) + : Layer(map, std::move(coreLayer)) { + } + SymbolLayer::~SymbolLayer() = default; // Property getters diff --git a/platform/android/src/style/layers/symbol_layer.hpp b/platform/android/src/style/layers/symbol_layer.hpp index 1048b01b14..98ce5572e9 100644 --- a/platform/android/src/style/layers/symbol_layer.hpp +++ b/platform/android/src/style/layers/symbol_layer.hpp @@ -22,6 +22,8 @@ public: SymbolLayer(mbgl::Map&, mbgl::style::SymbolLayer&); + SymbolLayer(mbgl::Map&, std::unique_ptr); + ~SymbolLayer(); // Property getters -- cgit v1.2.1