#include "offline_region_definition.hpp" #include "../geometry/lat_lng_bounds.hpp" #include "../geojson/geometry.hpp" #include namespace mbgl { namespace android { // OfflineRegionDefinition // jni::Class OfflineRegionDefinition::javaClass; void OfflineRegionDefinition::registerNative(jni::JNIEnv& env) { javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); } mbgl::OfflineRegionDefinition OfflineRegionDefinition::getDefinition(JNIEnv& env, jni::Object jDefinition) { if (jDefinition.IsInstanceOf(env, OfflineTilePyramidRegionDefinition::javaClass)) { return OfflineTilePyramidRegionDefinition::getDefinition(env, jni::Object(*jDefinition)); } else if (jDefinition.IsInstanceOf(env, OfflineGeometryRegionDefinition::javaClass)) { return OfflineGeometryRegionDefinition::getDefinition(env, jni::Object(*jDefinition)); } throw std::runtime_error("Unknown offline region definition java class"); } // OfflineTilePyramidRegionDefinition // jni::Object OfflineTilePyramidRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineTilePyramidRegionDefinition& definition) { //Convert objects auto styleURL = jni::Make(env, definition.styleURL); auto bounds = LatLngBounds::New(env, definition.bounds); static auto constructor = javaClass.GetConstructor, jni::jdouble, jni::jdouble, jni::jfloat>(env); auto jdefinition = javaClass.New(env, constructor, styleURL, bounds, definition.minZoom, definition.maxZoom, definition.pixelRatio); //Delete References jni::DeleteLocalRef(env, styleURL); jni::DeleteLocalRef(env, bounds); return jdefinition; } mbgl::OfflineTilePyramidRegionDefinition OfflineTilePyramidRegionDefinition::getDefinition(jni::JNIEnv& env, jni::Object jDefinition) { // Field references static auto styleURLF = javaClass.GetField(env, "styleURL"); static auto boundsF = javaClass.GetField>(env, "bounds"); static auto minZoomF = javaClass.GetField(env, "minZoom"); static auto maxZoomF = javaClass.GetField(env, "maxZoom"); static auto pixelRatioF = javaClass.GetField(env, "pixelRatio"); // Get objects auto jStyleURL = jDefinition.Get(env, styleURLF); auto jBounds = jDefinition.Get(env, boundsF); // Create definition mbgl::OfflineTilePyramidRegionDefinition definition( jni::Make(env, jStyleURL), LatLngBounds::getLatLngBounds(env, jBounds), jDefinition.Get(env, minZoomF), jDefinition.Get(env, maxZoomF), jDefinition.Get(env, pixelRatioF) ); // Delete references jni::DeleteLocalRef(env, jStyleURL); jni::DeleteLocalRef(env, jBounds); return definition; } jni::Class OfflineTilePyramidRegionDefinition::javaClass; void OfflineTilePyramidRegionDefinition::registerNative(jni::JNIEnv& env) { javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); } // OfflineGeometryRegionDefinition // jni::Object OfflineGeometryRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineGeometryRegionDefinition& definition) { //Convert objects auto styleURL = jni::Make(env, definition.styleURL); auto geometry = geojson::Geometry::New(env, definition.geometry); static auto constructor = javaClass.GetConstructor, jni::jdouble, jni::jdouble, jni::jfloat>(env); auto jdefinition = javaClass.New(env, constructor, styleURL, geometry, definition.minZoom, definition.maxZoom, definition.pixelRatio); //Delete References jni::DeleteLocalRef(env, styleURL); jni::DeleteLocalRef(env, geometry); return jdefinition; } mbgl::OfflineGeometryRegionDefinition OfflineGeometryRegionDefinition::getDefinition(jni::JNIEnv& env, jni::Object jDefinition) { // Field references static auto styleURLF = javaClass.GetField(env, "styleURL"); static auto geometryF = javaClass.GetField>(env, "geometry"); static auto minZoomF = javaClass.GetField(env, "minZoom"); static auto maxZoomF = javaClass.GetField(env, "maxZoom"); static auto pixelRatioF = javaClass.GetField(env, "pixelRatio"); // Get objects auto jStyleURL = jDefinition.Get(env, styleURLF); auto jGeometry = jDefinition.Get(env, geometryF); // Create definition mbgl::OfflineGeometryRegionDefinition definition( jni::Make(env, jStyleURL), geojson::Geometry::convert(env, jGeometry), jDefinition.Get(env, minZoomF), jDefinition.Get(env, maxZoomF), jDefinition.Get(env, pixelRatioF) ); // Delete references jni::DeleteLocalRef(env, jStyleURL); jni::DeleteLocalRef(env, jGeometry); return definition; } jni::Class OfflineGeometryRegionDefinition::javaClass; void OfflineGeometryRegionDefinition::registerNative(jni::JNIEnv& env) { javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); } } // namespace android } // namespace mbgl