diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2016-11-10 12:07:25 +0100 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2016-11-11 13:46:10 +0100 |
commit | 3a4a27c95f1c10c480532c46c4edb7b3120b7a2b (patch) | |
tree | d016d69968893b4e55af67cbefeb8087536f1f9e /platform/android/src | |
parent | 7d2f18b5ed94a857111d2863b1e1e4d1da232763 (diff) | |
download | qtlocation-mapboxgl-3a4a27c95f1c10c480532c46c4edb7b3120b7a2b.tar.gz |
[android] fix layer ownership
Diffstat (limited to 'platform/android/src')
-rwxr-xr-x | platform/android/src/jni.cpp | 11 | ||||
-rw-r--r-- | platform/android/src/style/layers/layer.cpp | 17 | ||||
-rw-r--r-- | platform/android/src/style/layers/layer.hpp | 13 |
3 files changed, 31 insertions, 10 deletions
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index 1168fb9b89..832fa436c7 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -1100,12 +1100,13 @@ void nativeAddLayer(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jlon assert(nativeLayerPtr != 0); NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr); - Layer *layer = reinterpret_cast<Layer *>(nativeLayerPtr); - nativeMapView->getMap().addLayer( - layer->releaseCoreLayer(), - before ? mbgl::optional<std::string>(std_string_from_jstring(env, before)) : mbgl::optional<std::string>() - ); + Layer *layer = reinterpret_cast<Layer *>(nativeLayerPtr); + try { + layer->addToMap(nativeMapView->getMap(), before ? mbgl::optional<std::string>(std_string_from_jstring(env, before)) : mbgl::optional<std::string>()); + } catch (const std::runtime_error& error) { + jni::ThrowNew(*env, jni::FindClass(*env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"), error.what()); + } } void nativeRemoveLayer(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jni::jstring* id) { diff --git a/platform/android/src/style/layers/layer.cpp b/platform/android/src/style/layers/layer.cpp index 3c1fc0af62..aa6df40470 100644 --- a/platform/android/src/style/layers/layer.cpp +++ b/platform/android/src/style/layers/layer.cpp @@ -32,8 +32,17 @@ namespace android { Layer::~Layer() { } - jni::String Layer::getId(jni::JNIEnv& env) { - return jni::Make<jni::String>(env, layer.getID()); + void Layer::addToMap(mbgl::Map& _map, mbgl::optional<std::string> before) { + //Check to see if we own the layer first + if (!ownedLayer) { + throw std::runtime_error("Cannot add layer twice"); + } + + //Add layer to map + _map.addLayer(releaseCoreLayer(), before); + + //Save pointer to the map + this->map = &_map; } std::unique_ptr<mbgl::style::Layer> Layer::releaseCoreLayer() { @@ -41,6 +50,10 @@ namespace android { return std::move(ownedLayer); } + jni::String Layer::getId(jni::JNIEnv& env) { + return jni::Make<jni::String>(env, layer.getID()); + } + void Layer::setLayoutProperty(jni::JNIEnv& env, jni::String jname, jni::Object<> jvalue) { Value value(env, jvalue); diff --git a/platform/android/src/style/layers/layer.hpp b/platform/android/src/style/layers/layer.hpp index 024a3c38b7..01eac2280b 100644 --- a/platform/android/src/style/layers/layer.hpp +++ b/platform/android/src/style/layers/layer.hpp @@ -34,10 +34,9 @@ public: virtual jni::jobject* createJavaPeer(jni::JNIEnv&) = 0; - jni::String getId(jni::JNIEnv&); + void addToMap(mbgl::Map&, mbgl::optional<std::string>); - //Release the owned view and return it - std::unique_ptr<mbgl::style::Layer> releaseCoreLayer(); + jni::String getId(jni::JNIEnv&); void setLayoutProperty(jni::JNIEnv&, jni::String, jni::Object<> value); @@ -64,8 +63,16 @@ public: jni::Object<jni::ObjectTag> getVisibility(jni::JNIEnv&); protected: + //Release the owned view and return it + std::unique_ptr<mbgl::style::Layer> releaseCoreLayer(); + + //Owned layer is set when creating a new layer, before adding it to the map std::unique_ptr<mbgl::style::Layer> ownedLayer; + + //Raw reference to the layer mbgl::style::Layer& layer; + + //Map is set when the layer is retrieved or after adding to the map mbgl::Map* map; }; |