From 62e85c1224de6d29b3c52f7049aff7e14347211d Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Fri, 24 Feb 2017 16:14:43 +0200 Subject: [PATCH] [android] add unknown source type --- .../style/sources/UnknownSource.java | 25 +++++++++++ platform/android/config.cmake | 2 + .../android/src/style/sources/sources.cpp | 8 ++-- .../src/style/sources/unknown_source.cpp | 42 +++++++++++++++++++ .../src/style/sources/unknown_source.hpp | 28 +++++++++++++ 5 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/UnknownSource.java create mode 100644 platform/android/src/style/sources/unknown_source.cpp create mode 100644 platform/android/src/style/sources/unknown_source.hpp diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/UnknownSource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/UnknownSource.java new file mode 100644 index 000000000..4a97d71f9 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/sources/UnknownSource.java @@ -0,0 +1,25 @@ +package com.mapbox.mapboxsdk.style.sources; + +import android.support.annotation.UiThread; + +/** + * An unknown type of source + */ +@UiThread +public class UnknownSource extends Source { + + /** + * Creates a UnknownSource. + * + * @param nativePtr pointer used by core + */ + UnknownSource(long nativePtr) { + super(nativePtr); + } + + protected native void initialize(); + + @Override + protected native void finalize() throws Throwable; + +} diff --git a/platform/android/config.cmake b/platform/android/config.cmake index 2a66f32b7..18458deba 100644 --- a/platform/android/config.cmake +++ b/platform/android/config.cmake @@ -124,6 +124,8 @@ macro(mbgl_platform_core) platform/android/src/style/sources/sources.hpp platform/android/src/style/sources/raster_source.cpp platform/android/src/style/sources/raster_source.hpp + platform/android/src/style/sources/unknown_source.cpp + platform/android/src/style/sources/unknown_source.hpp platform/android/src/style/sources/vector_source.cpp platform/android/src/style/sources/vector_source.hpp platform/android/src/style/functions/stop.cpp diff --git a/platform/android/src/style/sources/sources.cpp b/platform/android/src/style/sources/sources.cpp index cae4bb47b..b4e70202b 100644 --- a/platform/android/src/style/sources/sources.cpp +++ b/platform/android/src/style/sources/sources.cpp @@ -8,6 +8,7 @@ #include "source.hpp" #include "geojson_source.hpp" #include "raster_source.hpp" +#include "unknown_source.hpp" #include "vector_source.hpp" namespace mbgl { @@ -22,7 +23,7 @@ Source* initializeSourcePeer(mbgl::Map& map, mbgl::style::Source& coreSource) { } else if (coreSource.is()) { source = new GeoJSONSource(map, *coreSource.as()); } else { - throw new std::runtime_error("Source type not implemented"); + source = new UnknownSource(map, coreSource); } return source; @@ -37,9 +38,10 @@ jni::jobject* createJavaSourcePeer(jni::JNIEnv& env, mbgl::Map& map, mbgl::style void registerNativeSources(jni::JNIEnv& env) { Source::registerNative(env); - VectorSource::registerNative(env); - RasterSource::registerNative(env); GeoJSONSource::registerNative(env); + RasterSource::registerNative(env); + UnknownSource::registerNative(env); + VectorSource::registerNative(env); } } diff --git a/platform/android/src/style/sources/unknown_source.cpp b/platform/android/src/style/sources/unknown_source.cpp new file mode 100644 index 000000000..c1b1cc8c0 --- /dev/null +++ b/platform/android/src/style/sources/unknown_source.cpp @@ -0,0 +1,42 @@ +#include "unknown_source.hpp" + +namespace { + + // Dummy initializer (We don't support initializing this from the JVM) + std::unique_ptr init(jni::JNIEnv&) { + throw new std::runtime_error("UnknownSource should not be initialized from the JVM"); + } + +} // namespace + +namespace mbgl { +namespace android { + + UnknownSource::UnknownSource(mbgl::Map& map, mbgl::style::Source& coreSource) + : Source(map, coreSource) { + } + + jni::Class UnknownSource::javaClass; + + jni::jobject* UnknownSource::createJavaPeer(jni::JNIEnv& env) { + static auto constructor = UnknownSource::javaClass.template GetConstructor(env); + return UnknownSource::javaClass.New(env, constructor, reinterpret_cast(this)); + } + + void UnknownSource::registerNative(jni::JNIEnv& env) { + // Lookup the class + UnknownSource::javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); + + #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) + + // Register the peer + jni::RegisterNativePeer( + env, UnknownSource::javaClass, "nativePtr", + init, + "initialize", + "finalize" + ); + } + +} // namespace android +} // namespace mbgl diff --git a/platform/android/src/style/sources/unknown_source.hpp b/platform/android/src/style/sources/unknown_source.hpp new file mode 100644 index 000000000..3c3723979 --- /dev/null +++ b/platform/android/src/style/sources/unknown_source.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "source.hpp" +#include +#include + +namespace mbgl { +namespace android { + +class UnknownSource : public Source { +public: + + static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/UnknownSource"; }; + + static jni::Class javaClass; + + static void registerNative(jni::JNIEnv&); + + UnknownSource(mbgl::Map&, mbgl::style::Source&); + + ~UnknownSource() = default; + + jni::jobject* createJavaPeer(jni::JNIEnv&); + +}; // class UnknownSource + +} // namespace android +} // namespace mbgl