From 13e117b5016769f77dc6b3d3023f6c068e5a92ff Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Tue, 11 Dec 2018 15:45:27 +0200 Subject: [android] Enable core-only layers `LayerManagerAndroid` can add layer types that are enabled only for JSON style. It allows to save binary size - JNI glue code for these layer types won't be added to the binaries. --- .../android/src/style/layers/layer_manager.cpp | 41 +++++++++++++++++----- .../android/src/style/layers/layer_manager.hpp | 18 ++++++++-- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/platform/android/src/style/layers/layer_manager.cpp b/platform/android/src/style/layers/layer_manager.cpp index 706c5a76a1..2f023bd3ae 100644 --- a/platform/android/src/style/layers/layer_manager.cpp +++ b/platform/android/src/style/layers/layer_manager.cpp @@ -52,29 +52,43 @@ jni::Local> LayerManagerAndroid::createJavaLayerPeer(jni::JNI } void LayerManagerAndroid::registerNative(jni::JNIEnv& env) { + if (peerFactories.empty()) { + return; + } + Layer::registerNative(env); - for (const auto& factory: factories) { + for (const auto& factory: peerFactories) { factory->registerNative(env); } } void LayerManagerAndroid::addLayerType(std::unique_ptr factory) { - auto* coreFactory = factory->getLayerFactory(); - std::string type{coreFactory->getTypeInfo()->type}; + assert(getFactory(factory->getLayerFactory()->getTypeInfo()) == nullptr); + registerCoreFactory(factory->getLayerFactory()); + peerFactories.emplace_back(std::move(factory)); +} + +void LayerManagerAndroid::addLayerTypeCoreOnly(std::unique_ptr factory) { + assert(getFactory(factory->getTypeInfo()) == nullptr); + registerCoreFactory(factory.get()); + coreFactories.emplace_back(std::move(factory)); +} + +void LayerManagerAndroid::registerCoreFactory(mbgl::LayerFactory* factory) { + std::string type{factory->getTypeInfo()->type}; if (!type.empty()) { - typeToFactory.emplace(std::make_pair(std::move(type), coreFactory)); + assert(typeToFactory.find(type) == typeToFactory.end()); + typeToFactory.emplace(std::make_pair(std::move(type), factory)); } - factories.emplace_back(std::move(factory)); } JavaLayerPeerFactory* LayerManagerAndroid::getPeerFactory(const mbgl::style::LayerTypeInfo* typeInfo) { assert(typeInfo); - for (const auto& factory: factories) { + for (const auto& factory: peerFactories) { if (factory->getLayerFactory()->getTypeInfo() == typeInfo) { return factory.get(); } } - assert(false); return nullptr; } @@ -84,8 +98,17 @@ LayerFactory* LayerManagerAndroid::getFactory(const std::string& type) noexcept } LayerFactory* LayerManagerAndroid::getFactory(const mbgl::style::LayerTypeInfo* info) noexcept { - JavaLayerPeerFactory* peerFactory = getPeerFactory(info); - return (peerFactory != nullptr) ? peerFactory->getLayerFactory() : nullptr; + if (JavaLayerPeerFactory* peerFactory = getPeerFactory(info)) { + return peerFactory->getLayerFactory(); + } + + for (const auto& factory: coreFactories) { + if (factory->getTypeInfo() == info) { + return factory.get(); + } + } + + return nullptr; } // static diff --git a/platform/android/src/style/layers/layer_manager.hpp b/platform/android/src/style/layers/layer_manager.hpp index ff7e48027e..fb87721dd2 100644 --- a/platform/android/src/style/layers/layer_manager.hpp +++ b/platform/android/src/style/layers/layer_manager.hpp @@ -29,13 +29,27 @@ public: private: LayerManagerAndroid(); - void addLayerType(std::unique_ptr); + /** + * @brief Enables a layer type for both JSON style an runtime API. + */ + void addLayerType(std::unique_ptr); + /** + * @brief Enables a layer type for JSON style only. + * + * We might not want to expose runtime API for some layer types + * in order to save binary size - JNI glue code for these layer types + * won't be added to the binary. + */ + void addLayerTypeCoreOnly(std::unique_ptr); + + void registerCoreFactory(mbgl::LayerFactory*); JavaLayerPeerFactory* getPeerFactory(const mbgl::style::LayerTypeInfo*); // mbgl::LayerManager overrides. LayerFactory* getFactory(const std::string& type) noexcept final; LayerFactory* getFactory(const mbgl::style::LayerTypeInfo* info) noexcept final; - std::vector> factories; + std::vector> peerFactories; + std::vector> coreFactories; std::map typeToFactory; }; -- cgit v1.2.1