From 2464520da18f0f4cc7532adb3fb7b1f8f195304e Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 13 Mar 2018 12:31:56 +0200 Subject: [android] high-level jni bindings for geojson conversion --- .../android/src/geojson/geometry_collection.cpp | 63 ++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 platform/android/src/geojson/geometry_collection.cpp (limited to 'platform/android/src/geojson/geometry_collection.cpp') diff --git a/platform/android/src/geojson/geometry_collection.cpp b/platform/android/src/geojson/geometry_collection.cpp new file mode 100644 index 0000000000..eb3a790404 --- /dev/null +++ b/platform/android/src/geojson/geometry_collection.cpp @@ -0,0 +1,63 @@ +#include "geometry_collection.hpp" +#include "../java/util.hpp" + +namespace mbgl { +namespace android { +namespace geojson { + +jni::Object GeometryCollection::New(jni::JNIEnv& env, const mapbox::geometry::geometry_collection& collection) { + // Create an array of geometries + auto jarray = jni::Array>::New(env, collection.size(), Geometry::javaClass); + + for (size_t i = 0; i < collection.size(); i++) { + auto& geometry = collection.at(i); + auto jGeometry = Geometry::New(env, geometry); + jarray.Set(env, i, jGeometry); + jni::DeleteLocalRef(env, jGeometry); + } + + // Turn into array list + auto jList = java::util::Arrays::asList(env, jarray); + jni::DeleteLocalRef(env, jarray); + + // create the GeometryCollection + static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "fromGeometries"); + auto jCollection = javaClass.Call(env, method, jList); + + jni::DeleteLocalRef(env, jList); + return jCollection; +} + +mapbox::geometry::geometry_collection GeometryCollection::convert(jni::JNIEnv &env, jni::Object jCollection) { + // Get geometries + static auto getGeometries = javaClass.GetMethod ()>(env, "getGeometries"); + auto jList = jCollection.Call(env, getGeometries); + + // Turn into array + auto jarray = java::util::List::toArray(env, jList); + jni::DeleteLocalRef(env, jList); + + // Convert each geometry + mapbox::geometry::geometry_collection collection{}; + + auto size = jarray.Length(env); + for (jni::jsize i = 0; i < size; i++) { + auto element = jarray.Get(env, i); + collection.push_back(Geometry::convert(env, element)); + jni::DeleteLocalRef(env, element); + } + + jni::DeleteLocalRef(env, jarray); + return collection; +} + +void GeometryCollection::registerNative(jni::JNIEnv &env) { + // Lookup the class + javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); +} + +jni::Class GeometryCollection::javaClass; + +} // namespace geojson +} // namespace android +} // namespace mbgl \ No newline at end of file -- cgit v1.2.1