[android] Add jni binding for styleable snapshotter (#16286)

* [android] Add jni binding for styleable snapshotter

* Remove Map parameter from factories

- remove unused map from factory interfaces. Map is only needed for repaint.

* implement addlayer function

* Implement addsource function for snapshotter

* Implement addImages function

* format codes

* Apply baseline

* Update CHANGELOG.md

* Update map_snapshotter.cpp

* Destroy snapshotter on the thread it was created

* Activate file sources in start

* Use custom deleter for snapshotter

* format codes

* Release snapshotter pointer to deleting lambda

* Clang format

* Update CHANGELOG.md

* Fix review comments

* FIx review comments

Co-authored-by: Alexander Shalamov <alexander.shalamov@mapbox.com>
This commit is contained in:
Kevin Li
2020-03-24 14:33:54 +08:00
committed by GitHub
parent 1adc436c9d
commit 3f45b0a24b
34 changed files with 429 additions and 243 deletions

View File

@@ -8,6 +8,8 @@
The newly added `Renderer::clearData()` method allows to clear render data and thus save memory and make sure outdated tiles are not shown. It clears data more agressively than `Renderer::reduceMemoryUse()` does, as it clears not only the cache but all orchestration data, including the data used by the currently rendered frame.
- [android] Add jni binding for styleable snapshotter ([#16286](https://github.com/mapbox/mapbox-gl-native/pull/16286))
### 🐞 Bug fixes
- [core] Use `TileCoordinates` instead of `LngLat` for `within` expression calculation ([#16319](https://github.com/mapbox/mapbox-gl-native/pull/16319))

View File

@@ -3,7 +3,7 @@
[
"android-x86",
"/tmp/attach/install/android-x86-release/lib/libmapbox-gl.so",
1996967
1997677
]
]
}

View File

@@ -909,7 +909,7 @@ jni::Local<jni::Array<jni::Object<Layer>>> NativeMapView::getLayers(JNIEnv& env)
auto jLayers = jni::Array<jni::Object<Layer>>::New(env, layers.size());
int index = 0;
for (auto layer : layers) {
jLayers.Set(env, index, LayerManagerAndroid::get()->createJavaLayerPeer(env, *map, *layer));
jLayers.Set(env, index, LayerManagerAndroid::get()->createJavaLayerPeer(env, *layer));
index++;
}
@@ -926,7 +926,7 @@ jni::Local<jni::Object<Layer>> NativeMapView::getLayer(JNIEnv& env, const jni::S
}
// Create and return the layer's native peer
return LayerManagerAndroid::get()->createJavaLayerPeer(env, *map, *coreLayer);
return LayerManagerAndroid::get()->createJavaLayerPeer(env, *coreLayer);
}
void NativeMapView::addLayer(JNIEnv& env, jlong nativeLayerPtr, const jni::String& before) {
@@ -934,7 +934,9 @@ void NativeMapView::addLayer(JNIEnv& env, jlong nativeLayerPtr, const jni::Strin
Layer *layer = reinterpret_cast<Layer *>(nativeLayerPtr);
try {
layer->addToMap(*map, before ? mbgl::optional<std::string>(jni::Make<std::string>(env, before)) : mbgl::optional<std::string>());
layer->addToStyle(
map->getStyle(),
before ? mbgl::optional<std::string>(jni::Make<std::string>(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());
}
@@ -971,7 +973,7 @@ void NativeMapView::addLayerAbove(JNIEnv& env, jlong nativeLayerPtr, const jni::
// Add the layer
try {
layer->addToMap(*map, before);
layer->addToStyle(map->getStyle(), before);
} catch (const std::runtime_error& error) {
jni::ThrowNew(env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"), error.what());
}
@@ -994,7 +996,7 @@ void NativeMapView::addLayerAt(JNIEnv& env, jlong nativeLayerPtr, jni::jint inde
// Insert it below the current at that index
try {
layer->addToMap(*map, layers.at(index)->getID());
layer->addToStyle(map->getStyle(), layers.at(index)->getID());
} catch (const std::runtime_error& error) {
jni::ThrowNew(env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"), error.what());
}
@@ -1017,7 +1019,7 @@ jni::jboolean NativeMapView::removeLayerAt(JNIEnv& env, jni::jint index) {
std::unique_ptr<mbgl::style::Layer> coreLayer = map->getStyle().removeLayer(layers.at(index)->getID());
if (coreLayer) {
jni::Local<jni::Object<Layer>> layerObj =
LayerManagerAndroid::get()->createJavaLayerPeer(env, *map, std::move(coreLayer));
LayerManagerAndroid::get()->createJavaLayerPeer(env, std::move(coreLayer));
return jni::jni_true;
}
return jni::jni_false;
@@ -1141,6 +1143,11 @@ mbgl::Map& NativeMapView::getMap() {
return *map;
}
void NativeMapView::triggerRepaint(JNIEnv&) {
assert(map);
map->triggerRepaint();
}
// Static methods //
void NativeMapView::registerNative(jni::JNIEnv& env) {
@@ -1248,7 +1255,8 @@ void NativeMapView::registerNative(jni::JNIEnv& env) {
METHOD(&NativeMapView::setPrefetchTiles, "nativeSetPrefetchTiles"),
METHOD(&NativeMapView::getPrefetchTiles, "nativeGetPrefetchTiles"),
METHOD(&NativeMapView::setPrefetchZoomDelta, "nativeSetPrefetchZoomDelta"),
METHOD(&NativeMapView::getPrefetchZoomDelta, "nativeGetPrefetchZoomDelta"));
METHOD(&NativeMapView::getPrefetchZoomDelta, "nativeGetPrefetchZoomDelta"),
METHOD(&NativeMapView::triggerRepaint, "nativeTriggerRepaint"));
}
} // namespace android

View File

@@ -253,6 +253,8 @@ public:
mbgl::Map& getMap();
void triggerRepaint(JNIEnv&);
private:
std::unique_ptr<AndroidRendererFrontend> rendererFrontend;

View File

@@ -1,10 +1,10 @@
#include "map_snapshotter.hpp"
#include <mbgl/actor/scheduler.hpp>
#include <mbgl/renderer/renderer.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/util/logging.hpp>
#include <mbgl/util/string.hpp>
#include <mbgl/actor/scheduler.hpp>
#include "../attach_env.hpp"
#include "map_snapshot.hpp"
@@ -33,6 +33,8 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
return;
}
weakScheduler = mbgl::Scheduler::GetCurrent()->makeWeakPtr();
jFileSource = FileSource::getNativePeer(_env, _jFileSource);
auto size = mbgl::Size { static_cast<uint32_t>(width), static_cast<uint32_t>(height) };
@@ -43,7 +45,7 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
size,
pixelRatio,
mbgl::android::FileSource::getSharedResourceOptions(_env, _jFileSource),
mbgl::MapSnapshotterObserver::nullObserver(),
*this,
_localIdeographFontFamily ? jni::Make<std::string>(_env, _localIdeographFontFamily) : optional<std::string>{});
if (position) {
@@ -61,7 +63,17 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env,
}
}
MapSnapshotter::~MapSnapshotter() = default;
MapSnapshotter::~MapSnapshotter() {
auto guard = weakScheduler.lock();
if (weakScheduler && weakScheduler.get() != mbgl::Scheduler::GetCurrent()) {
snapshotter->cancel();
weakScheduler->schedule([ptr = snapshotter.release()]() mutable {
if (ptr) {
delete ptr;
}
});
}
}
void MapSnapshotter::start(JNIEnv& env) {
MBGL_VERIFY_THREAD(tid);
@@ -126,7 +138,6 @@ void MapSnapshotter::setRegion(JNIEnv& env, const jni::Object<LatLngBounds>& reg
snapshotter->setRegion(LatLngBounds::getLatLngBounds(env, region));
}
// Private methods //
void MapSnapshotter::activateFilesource(JNIEnv& env) {
@@ -143,6 +154,134 @@ void MapSnapshotter::deactivateFilesource(JNIEnv& env) {
}
}
void MapSnapshotter::onDidFailLoadingStyle(const std::string& error) {
MBGL_VERIFY_THREAD(tid);
android::UniqueEnv _env = android::AttachEnv();
static auto& javaClass = jni::Class<MapSnapshotter>::Singleton(*_env);
static auto onDidFailLoadingStyle = javaClass.GetMethod<void(jni::String)>(*_env, "onDidFailLoadingStyle");
auto weakReference = javaPeer.get(*_env);
if (weakReference) {
weakReference.Call(*_env, onDidFailLoadingStyle, jni::Make<jni::String>(*_env, error));
}
}
void MapSnapshotter::onDidFinishLoadingStyle() {
MBGL_VERIFY_THREAD(tid);
android::UniqueEnv _env = android::AttachEnv();
static auto& javaClass = jni::Class<MapSnapshotter>::Singleton(*_env);
static auto onDidFinishLoadingStyle = javaClass.GetMethod<void()>(*_env, "onDidFinishLoadingStyle");
auto weakReference = javaPeer.get(*_env);
if (weakReference) {
weakReference.Call(*_env, onDidFinishLoadingStyle);
}
}
void MapSnapshotter::onStyleImageMissing(const std::string& imageName) {
MBGL_VERIFY_THREAD(tid);
android::UniqueEnv _env = android::AttachEnv();
static auto& javaClass = jni::Class<MapSnapshotter>::Singleton(*_env);
static auto onStyleImageMissing = javaClass.GetMethod<void(jni::String)>(*_env, "onStyleImageMissing");
auto weakReference = javaPeer.get(*_env);
if (weakReference) {
weakReference.Call(*_env, onStyleImageMissing, jni::Make<jni::String>(*_env, imageName));
}
}
void MapSnapshotter::addLayerAt(JNIEnv& env, jlong nativeLayerPtr, jni::jint index) {
assert(nativeLayerPtr != 0);
const auto layers = snapshotter->getStyle().getLayers();
auto* layer = reinterpret_cast<Layer*>(nativeLayerPtr);
// Check index
const int numLayers = layers.size() - 1;
if (index > numLayers || index < 0) {
Log::Error(Event::JNI, "Index out of range: %i", index);
jni::ThrowNew(env,
jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"),
std::string("Invalid index").c_str());
}
// Insert it below the current at that index
try {
layer->addToStyle(snapshotter->getStyle(), layers.at(index)->getID());
} catch (const std::runtime_error& error) {
jni::ThrowNew(
env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"), error.what());
}
}
void MapSnapshotter::addLayerBelow(JNIEnv& env, jlong nativeLayerPtr, const jni::String& below) {
assert(nativeLayerPtr != 0);
auto* layer = reinterpret_cast<Layer*>(nativeLayerPtr);
try {
layer->addToStyle(
snapshotter->getStyle(),
below ? mbgl::optional<std::string>(jni::Make<std::string>(env, below)) : 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 MapSnapshotter::addLayerAbove(JNIEnv& env, jlong nativeLayerPtr, const jni::String& above) {
assert(nativeLayerPtr != 0);
auto* newLayer = reinterpret_cast<Layer*>(nativeLayerPtr);
// Find the sibling
const auto snapshotterLayers = snapshotter->getStyle().getLayers();
auto siblingId = jni::Make<std::string>(env, above);
size_t index = 0;
for (auto* snapshotterLayer : snapshotterLayers) {
++index;
if (snapshotterLayer->getID() == siblingId) {
break;
}
}
// Check if we found a sibling to place before
mbgl::optional<std::string> before;
if (index > snapshotterLayers.size()) {
// Not found
jni::ThrowNew(env,
jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"),
std::string("Could not find layer: ").append(siblingId).c_str());
} else if (index < snapshotterLayers.size()) {
// Place before the sibling
before = {snapshotterLayers.at(index)->getID()};
}
// Add the layer
try {
newLayer->addToStyle(snapshotter->getStyle(), before);
} catch (const std::runtime_error& error) {
jni::ThrowNew(
env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/layers/CannotAddLayerException"), error.what());
}
}
void MapSnapshotter::addSource(JNIEnv& env, const jni::Object<Source>& obj, jlong sourcePtr) {
assert(sourcePtr != 0);
auto* source = reinterpret_cast<Source*>(sourcePtr);
try {
source->addToStyle(env, obj, snapshotter->getStyle());
} catch (const std::runtime_error& error) {
jni::ThrowNew(
env, jni::FindClass(env, "com/mapbox/mapboxsdk/style/sources/CannotAddSourceException"), error.what());
}
}
void MapSnapshotter::addImages(JNIEnv& env, const jni::Array<jni::Object<mbgl::android::Image>>& jimages) {
jni::NullCheck(env, &jimages);
std::size_t len = jimages.Length(env);
for (std::size_t i = 0; i < len; ++i) {
auto image = mbgl::android::Image::getImage(env, jimages.Get(env, i));
snapshotter->getStyle().addImage(std::make_unique<mbgl::style::Image>(image));
}
}
// Static methods //
void MapSnapshotter::registerNative(jni::JNIEnv& env) {
@@ -152,18 +291,35 @@ void MapSnapshotter::registerNative(jni::JNIEnv& env) {
#define METHOD(MethodPtr, name) jni::MakeNativePeerMethod<decltype(MethodPtr), (MethodPtr)>(name)
// Register the peer
jni::RegisterNativePeer<MapSnapshotter>(env, javaClass, "nativePtr",
jni::MakePeer<MapSnapshotter, const jni::Object<MapSnapshotter>&, const jni::Object<FileSource>&, jni::jfloat, jni::jint, jni::jint, const jni::String&, const jni::String&, const jni::Object<LatLngBounds>&, const jni::Object<CameraPosition>&, jni::jboolean, const jni::String&>,
"nativeInitialize",
"finalize",
jni::RegisterNativePeer<MapSnapshotter>(env,
javaClass,
"nativePtr",
jni::MakePeer<MapSnapshotter,
const jni::Object<MapSnapshotter>&,
const jni::Object<FileSource>&,
jni::jfloat,
jni::jint,
jni::jint,
const jni::String&,
const jni::String&,
const jni::Object<LatLngBounds>&,
const jni::Object<CameraPosition>&,
jni::jboolean,
const jni::String&>,
"nativeInitialize",
"finalize",
METHOD(&MapSnapshotter::setStyleUrl, "setStyleUrl"),
METHOD(&MapSnapshotter::addLayerAt, "nativeAddLayerAt"),
METHOD(&MapSnapshotter::addLayerBelow, "nativeAddLayerBelow"),
METHOD(&MapSnapshotter::addLayerAbove, "nativeAddLayerAbove"),
METHOD(&MapSnapshotter::addSource, "nativeAddSource"),
METHOD(&MapSnapshotter::addImages, "nativeAddImages"),
METHOD(&MapSnapshotter::setStyleJson, "setStyleJson"),
METHOD(&MapSnapshotter::setSize, "setSize"),
METHOD(&MapSnapshotter::setCameraPosition, "setCameraPosition"),
METHOD(&MapSnapshotter::setRegion, "setRegion"),
METHOD(&MapSnapshotter::start, "nativeStart"),
METHOD(&MapSnapshotter::cancel, "nativeCancel")
);
METHOD(&MapSnapshotter::cancel, "nativeCancel"));
}
} // namespace android

View File

@@ -1,20 +1,23 @@
#pragma once
#include <jni/jni.hpp>
#include <mapbox/std/weak.hpp>
#include <mbgl/map/map_snapshotter.hpp>
#include <mbgl/util/util.hpp>
#include <memory>
#include "../file_source.hpp"
#include "../geometry/lat_lng_bounds.hpp"
#include "../map/camera_position.hpp"
#include <jni/jni.hpp>
#include <memory>
#include "../map/image.hpp"
#include "../style/layers/layer.hpp"
#include "../style/sources/source.hpp"
namespace mbgl {
namespace android {
class MapSnapshotter {
class MapSnapshotter final : public mbgl::MapSnapshotterObserver {
public:
static constexpr auto Name() { return "com/mapbox/mapboxsdk/snapshotter/MapSnapshotter"; };
@@ -34,7 +37,7 @@ public:
jni::jboolean showLogo,
const jni::String& localIdeographFontFamily);
~MapSnapshotter();
virtual ~MapSnapshotter() override;
void setStyleUrl(JNIEnv&, const jni::String& styleURL);
@@ -50,6 +53,17 @@ public:
void cancel(JNIEnv&);
void addLayerAt(JNIEnv&, jlong, jni::jint);
void addLayerBelow(JNIEnv&, jlong, const jni::String&);
void addLayerAbove(JNIEnv&, jlong, const jni::String&);
void addSource(JNIEnv&, const jni::Object<Source>&, jlong nativePtr);
void addImages(JNIEnv&, const jni::Array<jni::Object<mbgl::android::Image>>&);
// MapSnapshotterObserver overrides
void onDidFailLoadingStyle(const std::string&) override;
void onDidFinishLoadingStyle() override;
void onStyleImageMissing(const std::string&) override;
private:
MBGL_STORE_THREAD(tid);
@@ -59,12 +73,12 @@ private:
float pixelRatio;
bool showLogo;
std::unique_ptr<mbgl::MapSnapshotter> snapshotter;
FileSource *jFileSource;
void activateFilesource(JNIEnv&);
void deactivateFilesource(JNIEnv&);
bool activatedFilesource = false;
mapbox::base::WeakPtr<mbgl::Scheduler> weakScheduler;
std::unique_ptr<mbgl::MapSnapshotter> snapshotter;
};
} // namespace android

View File

@@ -26,16 +26,13 @@ namespace android {
/**
* 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) {
}
BackgroundLayer::BackgroundLayer(mbgl::style::BackgroundLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
BackgroundLayer::BackgroundLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::BackgroundLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
BackgroundLayer::BackgroundLayer(std::unique_ptr<mbgl::style::BackgroundLayer> coreLayer)
: Layer(std::move(coreLayer)) {}
BackgroundLayer::~BackgroundLayer() = default;
@@ -108,14 +105,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> BackgroundJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> BackgroundJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new BackgroundLayer(map, toBackgroundLayer(layer)));
return createJavaPeer(env, new BackgroundLayer(toBackgroundLayer(layer)));
}
jni::Local<jni::Object<Layer>> BackgroundJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> BackgroundJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new BackgroundLayer(map, std::unique_ptr<mbgl::style::BackgroundLayer>(static_cast<mbgl::style::BackgroundLayer*>(layer.release()))));
return createJavaPeer(env,
new BackgroundLayer(std::unique_ptr<mbgl::style::BackgroundLayer>(
static_cast<mbgl::style::BackgroundLayer*>(layer.release()))));
}
void BackgroundJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {
@@ -126,7 +127,9 @@ namespace android {
// Register the peer
jni::RegisterNativePeer<BackgroundLayer>(
env, javaClass, "nativePtr",
env,
javaClass,
"nativePtr",
jni::MakePeer<BackgroundLayer, jni::String&>,
"initialize",
"finalize",

View File

@@ -18,9 +18,9 @@ public:
BackgroundLayer(jni::JNIEnv&, jni::String&);
BackgroundLayer(mbgl::Map&, mbgl::style::BackgroundLayer&);
BackgroundLayer(mbgl::style::BackgroundLayer&);
BackgroundLayer(mbgl::Map&, std::unique_ptr<mbgl::style::BackgroundLayer>);
BackgroundLayer(std::unique_ptr<mbgl::style::BackgroundLayer>);
~BackgroundLayer();
@@ -45,8 +45,8 @@ public:
~BackgroundJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -26,16 +26,12 @@ namespace android {
/**
* 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) {
}
CircleLayer::CircleLayer(mbgl::style::CircleLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
CircleLayer::CircleLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::CircleLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
CircleLayer::CircleLayer(std::unique_ptr<mbgl::style::CircleLayer> coreLayer) : Layer(std::move(coreLayer)) {}
CircleLayer::~CircleLayer() = default;
@@ -213,14 +209,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> CircleJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> CircleJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new CircleLayer(map, toCircleLayer(layer)));
return createJavaPeer(env, new CircleLayer(toCircleLayer(layer)));
}
jni::Local<jni::Object<Layer>> CircleJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> CircleJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new CircleLayer(map, std::unique_ptr<mbgl::style::CircleLayer>(static_cast<mbgl::style::CircleLayer*>(layer.release()))));
return createJavaPeer(env,
new CircleLayer(std::unique_ptr<mbgl::style::CircleLayer>(
static_cast<mbgl::style::CircleLayer*>(layer.release()))));
}
void CircleJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {
@@ -231,7 +231,9 @@ namespace android {
// Register the peer
jni::RegisterNativePeer<CircleLayer>(
env, javaClass, "nativePtr",
env,
javaClass,
"nativePtr",
jni::MakePeer<CircleLayer, jni::String&, jni::String&>,
"initialize",
"finalize",

View File

@@ -18,9 +18,9 @@ public:
CircleLayer(jni::JNIEnv&, jni::String&, jni::String&);
CircleLayer(mbgl::Map&, mbgl::style::CircleLayer&);
CircleLayer(mbgl::style::CircleLayer&);
CircleLayer(mbgl::Map&, std::unique_ptr<mbgl::style::CircleLayer>);
CircleLayer(std::unique_ptr<mbgl::style::CircleLayer>);
~CircleLayer();
@@ -71,8 +71,8 @@ public:
~CircleJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -14,25 +14,12 @@ namespace android {
) {
}
CustomLayer::CustomLayer(mbgl::Map& map, mbgl::style::CustomLayer& coreLayer)
: Layer(map, coreLayer) {
}
CustomLayer::CustomLayer(mbgl::style::CustomLayer& coreLayer) : Layer(coreLayer) {}
CustomLayer::CustomLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::CustomLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
CustomLayer::CustomLayer(std::unique_ptr<mbgl::style::CustomLayer> coreLayer) : Layer(std::move(coreLayer)) {}
CustomLayer::~CustomLayer() = default;
void CustomLayer::update(jni::JNIEnv&) {
Log::Debug(mbgl::Event::JNI, "Updating map");
if (map) {
map->triggerRepaint();
} else {
Log::Error(mbgl::Event::JNI, "No map reference, cannot update");
}
}
namespace {
jni::Local<jni::Object<Layer>> createJavaPeer(jni::JNIEnv& env, Layer* layer) {
static auto& javaClass = jni::Class<CustomLayer>::Singleton(env);
@@ -43,12 +30,16 @@ namespace android {
CustomJavaLayerPeerFactory::~CustomJavaLayerPeerFactory() = default;
jni::Local<jni::Object<Layer>> CustomJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
return createJavaPeer(env, new CustomLayer(map, static_cast<mbgl::style::CustomLayer&>(layer)));
jni::Local<jni::Object<Layer>> CustomJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
return createJavaPeer(env, new CustomLayer(static_cast<mbgl::style::CustomLayer&>(layer)));
}
jni::Local<jni::Object<Layer>> CustomJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
return createJavaPeer(env, new CustomLayer(map, std::unique_ptr<mbgl::style::CustomLayer>(static_cast<mbgl::style::CustomLayer*>(layer.release()))));
jni::Local<jni::Object<Layer>> CustomJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
return createJavaPeer(env,
new CustomLayer(std::unique_ptr<mbgl::style::CustomLayer>(
static_cast<mbgl::style::CustomLayer*>(layer.release()))));
}
void CustomJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {
@@ -58,12 +49,12 @@ namespace android {
#define METHOD(MethodPtr, name) jni::MakeNativePeerMethod<decltype(MethodPtr), (MethodPtr)>(name)
// Register the peer
jni::RegisterNativePeer<CustomLayer>(
env, javaClass, "nativePtr",
jni::MakePeer<CustomLayer, const jni::String&, jni::jlong>,
"initialize",
"finalize",
METHOD(&CustomLayer::update, "nativeUpdate"));
jni::RegisterNativePeer<CustomLayer>(env,
javaClass,
"nativePtr",
jni::MakePeer<CustomLayer, const jni::String&, jni::jlong>,
"initialize",
"finalize");
}
} // namespace android

View File

@@ -16,14 +16,11 @@ public:
static void registerNative(jni::JNIEnv&);
CustomLayer(jni::JNIEnv&, const jni::String&, jni::jlong);
CustomLayer(mbgl::Map&, mbgl::style::CustomLayer&);
CustomLayer(mbgl::Map&, std::unique_ptr<mbgl::style::CustomLayer>);
CustomLayer(mbgl::style::CustomLayer&);
CustomLayer(std::unique_ptr<mbgl::style::CustomLayer>);
~CustomLayer();
void update(jni::JNIEnv&);
jni::Local<jni::Object<Layer>> createJavaPeer(jni::JNIEnv&);
}; // class CustomLayer
class CustomJavaLayerPeerFactory final : public JavaLayerPeerFactory, public mbgl::CustomLayerFactory {
@@ -31,8 +28,8 @@ public:
~CustomJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -26,16 +26,13 @@ namespace android {
/**
* Creates a non-owning peer object (for layers currently attached to the map)
*/
FillExtrusionLayer::FillExtrusionLayer(mbgl::Map& map, mbgl::style::FillExtrusionLayer& coreLayer)
: Layer(map, coreLayer) {
}
FillExtrusionLayer::FillExtrusionLayer(mbgl::style::FillExtrusionLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
FillExtrusionLayer::FillExtrusionLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::FillExtrusionLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
FillExtrusionLayer::FillExtrusionLayer(std::unique_ptr<mbgl::style::FillExtrusionLayer> coreLayer)
: Layer(std::move(coreLayer)) {}
FillExtrusionLayer::~FillExtrusionLayer() = default;
@@ -172,14 +169,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> FillExtrusionJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> FillExtrusionJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new FillExtrusionLayer(map, toFillExtrusionLayer(layer)));
return createJavaPeer(env, new FillExtrusionLayer(toFillExtrusionLayer(layer)));
}
jni::Local<jni::Object<Layer>> FillExtrusionJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> FillExtrusionJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new FillExtrusionLayer(map, std::unique_ptr<mbgl::style::FillExtrusionLayer>(static_cast<mbgl::style::FillExtrusionLayer*>(layer.release()))));
return createJavaPeer(env,
new FillExtrusionLayer(std::unique_ptr<mbgl::style::FillExtrusionLayer>(
static_cast<mbgl::style::FillExtrusionLayer*>(layer.release()))));
}
void FillExtrusionJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {
@@ -190,7 +191,9 @@ namespace android {
// Register the peer
jni::RegisterNativePeer<FillExtrusionLayer>(
env, javaClass, "nativePtr",
env,
javaClass,
"nativePtr",
jni::MakePeer<FillExtrusionLayer, jni::String&, jni::String&>,
"initialize",
"finalize",
@@ -200,8 +203,10 @@ namespace android {
METHOD(&FillExtrusionLayer::getFillExtrusionColorTransition, "nativeGetFillExtrusionColorTransition"),
METHOD(&FillExtrusionLayer::setFillExtrusionColorTransition, "nativeSetFillExtrusionColorTransition"),
METHOD(&FillExtrusionLayer::getFillExtrusionColor, "nativeGetFillExtrusionColor"),
METHOD(&FillExtrusionLayer::getFillExtrusionTranslateTransition, "nativeGetFillExtrusionTranslateTransition"),
METHOD(&FillExtrusionLayer::setFillExtrusionTranslateTransition, "nativeSetFillExtrusionTranslateTransition"),
METHOD(&FillExtrusionLayer::getFillExtrusionTranslateTransition,
"nativeGetFillExtrusionTranslateTransition"),
METHOD(&FillExtrusionLayer::setFillExtrusionTranslateTransition,
"nativeSetFillExtrusionTranslateTransition"),
METHOD(&FillExtrusionLayer::getFillExtrusionTranslate, "nativeGetFillExtrusionTranslate"),
METHOD(&FillExtrusionLayer::getFillExtrusionTranslateAnchor, "nativeGetFillExtrusionTranslateAnchor"),
METHOD(&FillExtrusionLayer::getFillExtrusionPatternTransition, "nativeGetFillExtrusionPatternTransition"),

View File

@@ -18,9 +18,9 @@ public:
FillExtrusionLayer(jni::JNIEnv&, jni::String&, jni::String&);
FillExtrusionLayer(mbgl::Map&, mbgl::style::FillExtrusionLayer&);
FillExtrusionLayer(mbgl::style::FillExtrusionLayer&);
FillExtrusionLayer(mbgl::Map&, std::unique_ptr<mbgl::style::FillExtrusionLayer>);
FillExtrusionLayer(std::unique_ptr<mbgl::style::FillExtrusionLayer>);
~FillExtrusionLayer();
@@ -61,8 +61,8 @@ public:
~FillExtrusionJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -26,16 +26,12 @@ namespace android {
/**
* 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) {
}
FillLayer::FillLayer(mbgl::style::FillLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
FillLayer::FillLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::FillLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
FillLayer::FillLayer(std::unique_ptr<mbgl::style::FillLayer> coreLayer) : Layer(std::move(coreLayer)) {}
FillLayer::~FillLayer() = default;
@@ -159,14 +155,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> FillJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> FillJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new FillLayer(map, toFillLayer(layer)));
return createJavaPeer(env, new FillLayer(toFillLayer(layer)));
}
jni::Local<jni::Object<Layer>> FillJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> FillJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new FillLayer(map, std::unique_ptr<mbgl::style::FillLayer>(static_cast<mbgl::style::FillLayer*>(layer.release()))));
return createJavaPeer(env,
new FillLayer(std::unique_ptr<mbgl::style::FillLayer>(
static_cast<mbgl::style::FillLayer*>(layer.release()))));
}
void FillJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {

View File

@@ -18,9 +18,9 @@ public:
FillLayer(jni::JNIEnv&, jni::String&, jni::String&);
FillLayer(mbgl::Map&, mbgl::style::FillLayer&);
FillLayer(mbgl::style::FillLayer&);
FillLayer(mbgl::Map&, std::unique_ptr<mbgl::style::FillLayer>);
FillLayer(std::unique_ptr<mbgl::style::FillLayer>);
~FillLayer();
@@ -59,8 +59,8 @@ public:
~FillJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -26,16 +26,12 @@ namespace android {
/**
* Creates a non-owning peer object (for layers currently attached to the map)
*/
HeatmapLayer::HeatmapLayer(mbgl::Map& map, mbgl::style::HeatmapLayer& coreLayer)
: Layer(map, coreLayer) {
}
HeatmapLayer::HeatmapLayer(mbgl::style::HeatmapLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
HeatmapLayer::HeatmapLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::HeatmapLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
HeatmapLayer::HeatmapLayer(std::unique_ptr<mbgl::style::HeatmapLayer> coreLayer) : Layer(std::move(coreLayer)) {}
HeatmapLayer::~HeatmapLayer() = default;
@@ -122,14 +118,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> HeatmapJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> HeatmapJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new HeatmapLayer(map, toHeatmapLayer(layer)));
return createJavaPeer(env, new HeatmapLayer(toHeatmapLayer(layer)));
}
jni::Local<jni::Object<Layer>> HeatmapJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> HeatmapJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new HeatmapLayer(map, std::unique_ptr<mbgl::style::HeatmapLayer>(static_cast<mbgl::style::HeatmapLayer*>(layer.release()))));
return createJavaPeer(env,
new HeatmapLayer(std::unique_ptr<mbgl::style::HeatmapLayer>(
static_cast<mbgl::style::HeatmapLayer*>(layer.release()))));
}
void HeatmapJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {
@@ -140,7 +140,9 @@ namespace android {
// Register the peer
jni::RegisterNativePeer<HeatmapLayer>(
env, javaClass, "nativePtr",
env,
javaClass,
"nativePtr",
jni::MakePeer<HeatmapLayer, jni::String&, jni::String&>,
"initialize",
"finalize",

View File

@@ -18,9 +18,9 @@ public:
HeatmapLayer(jni::JNIEnv&, jni::String&, jni::String&);
HeatmapLayer(mbgl::Map&, mbgl::style::HeatmapLayer&);
HeatmapLayer(mbgl::style::HeatmapLayer&);
HeatmapLayer(mbgl::Map&, std::unique_ptr<mbgl::style::HeatmapLayer>);
HeatmapLayer(std::unique_ptr<mbgl::style::HeatmapLayer>);
~HeatmapLayer();
@@ -49,8 +49,8 @@ public:
~HeatmapJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -26,16 +26,13 @@ namespace android {
/**
* Creates a non-owning peer object (for layers currently attached to the map)
*/
HillshadeLayer::HillshadeLayer(mbgl::Map& map, mbgl::style::HillshadeLayer& coreLayer)
: Layer(map, coreLayer) {
}
HillshadeLayer::HillshadeLayer(mbgl::style::HillshadeLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
HillshadeLayer::HillshadeLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::HillshadeLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
HillshadeLayer::HillshadeLayer(std::unique_ptr<mbgl::style::HillshadeLayer> coreLayer)
: Layer(std::move(coreLayer)) {}
HillshadeLayer::~HillshadeLayer() = default;
@@ -136,14 +133,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> HillshadeJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> HillshadeJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new HillshadeLayer(map, toHillshadeLayer(layer)));
return createJavaPeer(env, new HillshadeLayer(toHillshadeLayer(layer)));
}
jni::Local<jni::Object<Layer>> HillshadeJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> HillshadeJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new HillshadeLayer(map, std::unique_ptr<mbgl::style::HillshadeLayer>(static_cast<mbgl::style::HillshadeLayer*>(layer.release()))));
return createJavaPeer(env,
new HillshadeLayer(std::unique_ptr<mbgl::style::HillshadeLayer>(
static_cast<mbgl::style::HillshadeLayer*>(layer.release()))));
}
void HillshadeJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {
@@ -154,7 +155,9 @@ namespace android {
// Register the peer
jni::RegisterNativePeer<HillshadeLayer>(
env, javaClass, "nativePtr",
env,
javaClass,
"nativePtr",
jni::MakePeer<HillshadeLayer, jni::String&, jni::String&>,
"initialize",
"finalize",

View File

@@ -18,9 +18,9 @@ public:
HillshadeLayer(jni::JNIEnv&, jni::String&, jni::String&);
HillshadeLayer(mbgl::Map&, mbgl::style::HillshadeLayer&);
HillshadeLayer(mbgl::style::HillshadeLayer&);
HillshadeLayer(mbgl::Map&, std::unique_ptr<mbgl::style::HillshadeLayer>);
HillshadeLayer(std::unique_ptr<mbgl::style::HillshadeLayer>);
~HillshadeLayer();
@@ -53,8 +53,8 @@ public:
~HillshadeJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -45,33 +45,19 @@ namespace android {
/**
* 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<mbgl::style::Layer> coreLayer)
: ownedLayer(std::move(coreLayer))
, layer(*ownedLayer)
, map(&coreMap) {
}
Layer::Layer(mbgl::style::Layer& coreLayer) : layer(coreLayer) {}
Layer::~Layer() {
}
void Layer::addToMap(mbgl::Map& _map, mbgl::optional<std::string> before) {
void Layer::addToStyle(mbgl::style::Style& style, 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.getStyle().addLayer(releaseCoreLayer(), before);
// Save pointer to the map
this->map = &_map;
style.addLayer(releaseCoreLayer(), before);
}
void Layer::setLayer(std::unique_ptr<mbgl::style::Layer> sourceLayer) {

View File

@@ -38,15 +38,15 @@ namespace android {
/**
* 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) {
<%- camelize(type) %>Layer::<%- camelize(type) %>Layer(mbgl::style::<%- camelize(type) %>Layer& coreLayer)
: Layer(coreLayer) {
}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
<%- camelize(type) %>Layer::<%- camelize(type) %>Layer(mbgl::Map& map, std::unique_ptr<mbgl::style::<%- camelize(type) %>Layer> coreLayer)
: Layer(map, std::move(coreLayer)) {
<%- camelize(type) %>Layer::<%- camelize(type) %>Layer(std::unique_ptr<mbgl::style::<%- camelize(type) %>Layer> coreLayer)
: Layer(std::move(coreLayer)) {
}
<%- camelize(type) %>Layer::~<%- camelize(type) %>Layer() = default;
@@ -100,14 +100,14 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> <%- camelize(type) %>JavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> <%- camelize(type) %>JavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new <%- camelize(type) %>Layer(map, to<%- camelize(type) %>Layer(layer)));
return createJavaPeer(env, new <%- camelize(type) %>Layer(to<%- camelize(type) %>Layer(layer)));
}
jni::Local<jni::Object<Layer>> <%- camelize(type) %>JavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> <%- camelize(type) %>JavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new <%- camelize(type) %>Layer(map, std::unique_ptr<mbgl::style::<%- camelize(type) %>Layer>(static_cast<mbgl::style::<%- camelize(type) %>Layer*>(layer.release()))));
return createJavaPeer(env, new <%- camelize(type) %>Layer(std::unique_ptr<mbgl::style::<%- camelize(type) %>Layer>(static_cast<mbgl::style::<%- camelize(type) %>Layer*>(layer.release()))));
}
void <%- camelize(type) %>JavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {

View File

@@ -1,11 +1,11 @@
#pragma once
#include <mbgl/layermanager/layer_factory.hpp>
#include <mbgl/map/map.hpp>
#include <mbgl/style/layer.hpp>
#include <mbgl/style/style.hpp>
#include "../../gson/json_array.hpp"
#include "../value.hpp"
#include "../../gson/json_element.hpp"
#include "../value.hpp"
#include <jni/jni.hpp>
@@ -27,7 +27,7 @@ public:
*/
void setLayer(std::unique_ptr<mbgl::style::Layer>);
void addToMap(mbgl::Map&, mbgl::optional<std::string>);
void addToStyle(mbgl::style::Style&, mbgl::optional<std::string>);
// Release the owned view and return it
std::unique_ptr<mbgl::style::Layer> releaseCoreLayer();
@@ -68,16 +68,11 @@ protected:
/*
* Called when a non-owning peer object is created on the c++ side
*/
Layer(mbgl::Map&, mbgl::style::Layer&);
Layer(mbgl::style::Layer&);
/*
* Called when a owning peer object is created on the c++ side
*/
Layer(mbgl::Map&, std::unique_ptr<mbgl::style::Layer>);
/*
* Called when a Java object was created from the jvm side
*/
Layer(std::unique_ptr<mbgl::style::Layer>);
// Owned layer is set when creating a new layer, before adding it to the map
@@ -85,9 +80,6 @@ protected:
// 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;
};
/**
@@ -99,12 +91,13 @@ public:
/**
* @brief Create a non-owning peer.
*/
virtual jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) = 0;
virtual jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) = 0;
/**
* @brief Create an owning peer.
*/
virtual jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) = 0;
virtual jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env,
std::unique_ptr<mbgl::style::Layer>) = 0;
/**
* @brief Register peer methods.

View File

@@ -26,9 +26,9 @@ public:
<%- camelize(type) %>Layer(jni::JNIEnv&, jni::String&, jni::String&);
<% } -%>
<%- camelize(type) %>Layer(mbgl::Map&, mbgl::style::<%- camelize(type) %>Layer&);
<%- camelize(type) %>Layer(mbgl::style::<%- camelize(type) %>Layer&);
<%- camelize(type) %>Layer(mbgl::Map&, std::unique_ptr<mbgl::style::<%- camelize(type) %>Layer>);
<%- camelize(type) %>Layer(std::unique_ptr<mbgl::style::<%- camelize(type) %>Layer>);
~<%- camelize(type) %>Layer();
@@ -49,8 +49,8 @@ public:
~<%- camelize(type) %>JavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -77,16 +77,17 @@ LayerManagerAndroid::LayerManagerAndroid() {
LayerManagerAndroid::~LayerManagerAndroid() = default;
jni::Local<jni::Object<Layer>> LayerManagerAndroid::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> LayerManagerAndroid::createJavaLayerPeer(jni::JNIEnv& env, mbgl::style::Layer& layer) {
if (JavaLayerPeerFactory* factory = getPeerFactory(layer.getTypeInfo())) {
return factory->createJavaLayerPeer(env, map, layer);
return factory->createJavaLayerPeer(env, layer);
}
return jni::Local<jni::Object<Layer>>();
}
jni::Local<jni::Object<Layer>> LayerManagerAndroid::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> LayerManagerAndroid::createJavaLayerPeer(jni::JNIEnv& env,
std::unique_ptr<mbgl::style::Layer> layer) {
if (JavaLayerPeerFactory* factory = getPeerFactory(layer->getTypeInfo())) {
return factory->createJavaLayerPeer(env, map, std::move(layer));
return factory->createJavaLayerPeer(env, std::move(layer));
}
return jni::Local<jni::Object<Layer>>();
}

View File

@@ -21,9 +21,9 @@ class LayerManagerAndroid final : public mbgl::LayerManager {
public:
~LayerManagerAndroid() final;
static LayerManagerAndroid* get() noexcept;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&);
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>);
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&);
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>);
void registerNative(jni::JNIEnv&);

View File

@@ -26,16 +26,12 @@ namespace android {
/**
* 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) {
}
LineLayer::LineLayer(mbgl::style::LineLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
LineLayer::LineLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::LineLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
LineLayer::LineLayer(std::unique_ptr<mbgl::style::LineLayer> coreLayer) : Layer(std::move(coreLayer)) {}
LineLayer::~LineLayer() = default;
@@ -251,14 +247,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> LineJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> LineJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new LineLayer(map, toLineLayer(layer)));
return createJavaPeer(env, new LineLayer(toLineLayer(layer)));
}
jni::Local<jni::Object<Layer>> LineJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> LineJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new LineLayer(map, std::unique_ptr<mbgl::style::LineLayer>(static_cast<mbgl::style::LineLayer*>(layer.release()))));
return createJavaPeer(env,
new LineLayer(std::unique_ptr<mbgl::style::LineLayer>(
static_cast<mbgl::style::LineLayer*>(layer.release()))));
}
void LineJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {

View File

@@ -18,9 +18,9 @@ public:
LineLayer(jni::JNIEnv&, jni::String&, jni::String&);
LineLayer(mbgl::Map&, mbgl::style::LineLayer&);
LineLayer(mbgl::style::LineLayer&);
LineLayer(mbgl::Map&, std::unique_ptr<mbgl::style::LineLayer>);
LineLayer(std::unique_ptr<mbgl::style::LineLayer>);
~LineLayer();
@@ -83,8 +83,8 @@ public:
~LineJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -26,16 +26,12 @@ namespace android {
/**
* 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) {
}
RasterLayer::RasterLayer(mbgl::style::RasterLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
RasterLayer::RasterLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::RasterLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
RasterLayer::RasterLayer(std::unique_ptr<mbgl::style::RasterLayer> coreLayer) : Layer(std::move(coreLayer)) {}
RasterLayer::~RasterLayer() = default;
@@ -172,14 +168,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> RasterJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> RasterJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new RasterLayer(map, toRasterLayer(layer)));
return createJavaPeer(env, new RasterLayer(toRasterLayer(layer)));
}
jni::Local<jni::Object<Layer>> RasterJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> RasterJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new RasterLayer(map, std::unique_ptr<mbgl::style::RasterLayer>(static_cast<mbgl::style::RasterLayer*>(layer.release()))));
return createJavaPeer(env,
new RasterLayer(std::unique_ptr<mbgl::style::RasterLayer>(
static_cast<mbgl::style::RasterLayer*>(layer.release()))));
}
void RasterJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {
@@ -190,7 +190,9 @@ namespace android {
// Register the peer
jni::RegisterNativePeer<RasterLayer>(
env, javaClass, "nativePtr",
env,
javaClass,
"nativePtr",
jni::MakePeer<RasterLayer, jni::String&, jni::String&>,
"initialize",
"finalize",

View File

@@ -18,9 +18,9 @@ public:
RasterLayer(jni::JNIEnv&, jni::String&, jni::String&);
RasterLayer(mbgl::Map&, mbgl::style::RasterLayer&);
RasterLayer(mbgl::style::RasterLayer&);
RasterLayer(mbgl::Map&, std::unique_ptr<mbgl::style::RasterLayer>);
RasterLayer(std::unique_ptr<mbgl::style::RasterLayer>);
~RasterLayer();
@@ -61,8 +61,8 @@ public:
~RasterJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -26,16 +26,12 @@ namespace android {
/**
* 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) {
}
SymbolLayer::SymbolLayer(mbgl::style::SymbolLayer& coreLayer) : Layer(coreLayer) {}
/**
* Creates an owning peer object (for layers not attached to the map)
*/
SymbolLayer::SymbolLayer(mbgl::Map& map, std::unique_ptr<mbgl::style::SymbolLayer> coreLayer)
: Layer(map, std::move(coreLayer)) {
}
SymbolLayer::SymbolLayer(std::unique_ptr<mbgl::style::SymbolLayer> coreLayer) : Layer(std::move(coreLayer)) {}
SymbolLayer::~SymbolLayer() = default;
@@ -485,14 +481,18 @@ namespace android {
}
} // namespace
jni::Local<jni::Object<Layer>> SymbolJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style::Layer& layer) {
jni::Local<jni::Object<Layer>> SymbolJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env,
mbgl::style::Layer& layer) {
assert(layer.baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new SymbolLayer(map, toSymbolLayer(layer)));
return createJavaPeer(env, new SymbolLayer(toSymbolLayer(layer)));
}
jni::Local<jni::Object<Layer>> SymbolJavaLayerPeerFactory::createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer> layer) {
jni::Local<jni::Object<Layer>> SymbolJavaLayerPeerFactory::createJavaLayerPeer(
jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer> layer) {
assert(layer->baseImpl->getTypeInfo() == getTypeInfo());
return createJavaPeer(env, new SymbolLayer(map, std::unique_ptr<mbgl::style::SymbolLayer>(static_cast<mbgl::style::SymbolLayer*>(layer.release()))));
return createJavaPeer(env,
new SymbolLayer(std::unique_ptr<mbgl::style::SymbolLayer>(
static_cast<mbgl::style::SymbolLayer*>(layer.release()))));
}
void SymbolJavaLayerPeerFactory::registerNative(jni::JNIEnv& env) {
@@ -503,7 +503,9 @@ namespace android {
// Register the peer
jni::RegisterNativePeer<SymbolLayer>(
env, javaClass, "nativePtr",
env,
javaClass,
"nativePtr",
jni::MakePeer<SymbolLayer, jni::String&, jni::String&>,
"initialize",
"finalize",

View File

@@ -18,9 +18,9 @@ public:
SymbolLayer(jni::JNIEnv&, jni::String&, jni::String&);
SymbolLayer(mbgl::Map&, mbgl::style::SymbolLayer&);
SymbolLayer(mbgl::style::SymbolLayer&);
SymbolLayer(mbgl::Map&, std::unique_ptr<mbgl::style::SymbolLayer>);
SymbolLayer(std::unique_ptr<mbgl::style::SymbolLayer>);
~SymbolLayer();
@@ -167,8 +167,8 @@ public:
~SymbolJavaLayerPeerFactory() override;
// JavaLayerPeerFactory overrides.
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr<mbgl::style::Layer>) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv&, mbgl::style::Layer&) final;
jni::Local<jni::Object<Layer>> createJavaLayerPeer(jni::JNIEnv& env, std::unique_ptr<mbgl::style::Layer>) final;
void registerNative(jni::JNIEnv&) final;

View File

@@ -109,6 +109,21 @@ namespace android {
return jni::Local<jni::Integer>(env, nullptr);
}
void Source::addToStyle(JNIEnv& env, const jni::Object<Source>& obj, mbgl::style::Style& style) {
if (!ownedSource) {
throw std::runtime_error("Cannot add source twice");
}
// Add source to style and release ownership
style.addSource(std::move(ownedSource));
// Add peer to core source
source.peer = std::unique_ptr<Source>(this);
// Add strong reference to java source
javaPeer = jni::NewGlobal(env, obj);
}
void Source::addToMap(JNIEnv& env, const jni::Object<Source>& obj, mbgl::Map& map, AndroidRendererFrontend& frontend) {
// Check to see if we own the source first
if (!ownedSource) {

View File

@@ -47,6 +47,8 @@ public:
jni::Local<jni::Integer> getPrefetchZoomDelta(jni::JNIEnv&);
void addToStyle(JNIEnv& env, const jni::Object<Source>& obj, mbgl::style::Style& style);
protected:
// Set on newly created sources until added to the map.
std::unique_ptr<mbgl::style::Source> ownedSource;