summaryrefslogtreecommitdiff
path: root/platform/android/src/geojson
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/geojson')
-rw-r--r--platform/android/src/geojson/conversion/feature.cpp162
-rw-r--r--platform/android/src/geojson/conversion/feature.hpp11
-rw-r--r--platform/android/src/geojson/feature.cpp43
-rw-r--r--platform/android/src/geojson/feature.hpp3
-rw-r--r--platform/android/src/geojson/feature_collection.cpp21
-rw-r--r--platform/android/src/geojson/feature_collection.hpp2
-rw-r--r--platform/android/src/geojson/geometry.cpp27
-rw-r--r--platform/android/src/geojson/geometry.hpp5
-rw-r--r--platform/android/src/geojson/geometry_collection.cpp36
-rw-r--r--platform/android/src/geojson/geometry_collection.hpp2
-rw-r--r--platform/android/src/geojson/line_string.cpp30
-rw-r--r--platform/android/src/geojson/line_string.hpp2
-rw-r--r--platform/android/src/geojson/multi_line_string.cpp31
-rw-r--r--platform/android/src/geojson/multi_line_string.hpp2
-rw-r--r--platform/android/src/geojson/multi_point.cpp20
-rw-r--r--platform/android/src/geojson/multi_point.hpp2
-rw-r--r--platform/android/src/geojson/multi_polygon.cpp44
-rw-r--r--platform/android/src/geojson/multi_polygon.hpp2
-rw-r--r--platform/android/src/geojson/point.cpp29
-rw-r--r--platform/android/src/geojson/point.hpp2
-rw-r--r--platform/android/src/geojson/polygon.cpp19
-rw-r--r--platform/android/src/geojson/polygon.hpp2
-rw-r--r--platform/android/src/geojson/util.hpp22
23 files changed, 128 insertions, 391 deletions
diff --git a/platform/android/src/geojson/conversion/feature.cpp b/platform/android/src/geojson/conversion/feature.cpp
index 3cb6d37b17..7386e29df5 100644
--- a/platform/android/src/geojson/conversion/feature.cpp
+++ b/platform/android/src/geojson/conversion/feature.cpp
@@ -1,13 +1,13 @@
#include "feature.hpp"
-#include "../../conversion/constant.hpp"
-#include "../../conversion/conversion.hpp"
-#include "../../jni/local_object.hpp"
+#include "../../gson/json_object.hpp"
namespace mbgl {
namespace android {
namespace conversion {
+using namespace gson;
+
/**
* Turn feature identifier into std::string
*/
@@ -29,158 +29,22 @@ public:
};
-/**
- * Turn properties into Java GSON JsonObject's
- */
-class PropertyValueEvaluator {
-public:
- jni::JNIEnv& env;
-
- /**
- * null
- */
- jni::jobject* operator()(const mapbox::geometry::null_value_t &) const {
- return (jni::jobject*) nullptr;
- }
-
- /**
- * Boolean primitive
- */
- jni::jobject* operator()(const bool& value) const {
- static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/google/gson/JsonPrimitive")).release();
- static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "<init>", "(Ljava/lang/Boolean;)V");
-
- // Create JsonPrimitive
- jni::LocalObject<jni::jobject> converted = jni::NewLocalObject(env, *convert<jni::jobject*, bool>(env, value));
- jni::jobject* object = &jni::NewObject(env, *javaClass, *constructor, *converted);
-
- return object;
- }
-
- /**
- * String primitive
- */
- jni::jobject* operator()(const std::string& value) const {
- static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/google/gson/JsonPrimitive")).release();
- static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "<init>", "(Ljava/lang/String;)V");
-
- // Create JsonPrimitive
- jni::LocalObject<jni::jobject> converted = jni::NewLocalObject(env, *convert<jni::jobject*, std::string>(env, value));
- jni::jobject* object = &jni::NewObject(env, *javaClass, *constructor, converted.get());
-
- return object;
- }
-
- /**
- * Number primitives
- */
- template <class Number>
- jni::jobject* operator()(const Number& value) const {
- static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/google/gson/JsonPrimitive")).release();
- static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "<init>", "(Ljava/lang/Number;)V");
-
- // Create JsonPrimitive
- jni::LocalObject<jni::jobject> converted = jni::NewLocalObject(env, *convert<jni::jobject*, Number>(env, value));
- jni::jobject* object = &jni::NewObject(env, *javaClass, *constructor, converted.get());
-
- return object;
- }
-
-
- /**
- * Json Array
- */
- jni::jobject* operator()(const std::vector<mbgl::Value> &values) const {
- static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/google/gson/JsonArray")).release();
- static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "<init>", "()V");;
- static jni::jmethodID* add = &jni::GetMethodID(env, *javaClass, "add", "(Lcom/google/gson/JsonElement;)V");
-
- // Create json array
- jni::jobject* jarray = &jni::NewObject(env, *javaClass, *constructor);
-
- // Add values
- for (const auto &v : values) {
- jni::LocalObject<jni::jobject> converted = jni::NewLocalObject(env, mbgl::Value::visit(v, *this));
- jni::CallMethod<void>(env, jarray, *add, converted.get());
- }
-
- return jarray;
- }
-
- /**
- * Json Object
- */
- jni::jobject* operator()(const std::unordered_map<std::string, mbgl::Value> &value) const {
- // TODO: clean up duplication here
- static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/google/gson/JsonObject")).release();
- static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "<init>", "()V");;
- static jni::jmethodID* add = &jni::GetMethodID(env, *javaClass, "add", "(Ljava/lang/String;Lcom/google/gson/JsonElement;)V");
-
- // Create json object
- jni::jobject* jsonObject = &jni::NewObject(env, *javaClass, *constructor);
-
- // Add items
- for (auto &item : value) {
- jni::LocalObject<jni::jobject> converted = jni::NewLocalObject(env, mbgl::Value::visit(item.second, *this));
- jni::LocalObject<jni::jobject> key = jni::NewLocalObject(env, *convert<jni::jobject*, std::string>(env, item.first));
- jni::CallMethod<void>(env, jsonObject, *add, key.get(), converted.get());
- }
-
- return jsonObject;
- }
-};
-
-Result<jni::jobject*> Converter<jni::jobject*, std::unordered_map<std::string, mbgl::Value>>::operator()(jni::JNIEnv& env, const std::unordered_map<std::string, mbgl::Value>& value) const {
- static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/google/gson/JsonObject")).release();
- static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "<init>", "()V");;
- static jni::jmethodID* add = &jni::GetMethodID(env, *javaClass, "add", "(Ljava/lang/String;Lcom/google/gson/JsonElement;)V");
-
- // Create json object
- jni::jobject* jsonObject = &jni::NewObject(env, *javaClass, *constructor);
-
- // Add items
- PropertyValueEvaluator evaluator {env};
- for (auto &item : value) {
- jni::LocalObject<jni::jobject> converted = jni::NewLocalObject(env, mbgl::Value::visit(item.second, evaluator));
- jni::LocalObject<jni::jobject> key = jni::NewLocalObject(env, *convert<jni::jobject*, std::string>(env, item.first));
- jni::CallMethod<void>(env, jsonObject, *add, key.get(), converted.get());
- }
-
- return {jsonObject};
-}
-
-Result<jni::Object<android::geojson::Feature>> Converter<jni::Object<android::geojson::Feature>, mbgl::Feature>::operator()(jni::JNIEnv& env, const mbgl::Feature& value) const {
-
- // Convert Id
- FeatureIdVisitor idEvaluator;
- std::string id = (value.id) ? mapbox::geometry::identifier::visit(value.id.value(), idEvaluator) : "";
- auto jid = jni::Make<jni::String>(env, id);
-
- // Convert properties
- auto properties = jni::Object<gson::JsonObject>(*convert<jni::jobject*>(env, value.properties));
-
- // Convert geometry
- auto geometry = android::geojson::Geometry::New(env, value.geometry);
-
- // Create feature
- auto feature = android::geojson::Feature::fromGeometry(env, geometry, properties, jid);
-
- //Cleanup
- jni::DeleteLocalRef(env, jid);
- jni::DeleteLocalRef(env, geometry);
- jni::DeleteLocalRef(env, properties);
+jni::Object<android::geojson::Feature> convertFeature(jni::JNIEnv& env, const mbgl::Feature& value) {
+ using namespace mbgl::android::geojson;
- return feature;
+ return Feature::fromGeometry(env,
+ *jni::SeizeLocal(env, Geometry::New(env, value.geometry)),
+ *jni::SeizeLocal(env, JsonObject::New(env, value.properties)),
+ *jni::SeizeLocal(env, jni::Make<jni::String>(env, value.id ? value.id.value().match(FeatureIdVisitor()) : "")));
}
Result<jni::Array<jni::Object<android::geojson::Feature>>> Converter<jni::Array<jni::Object<android::geojson::Feature>>, std::vector<mbgl::Feature>>::operator()(jni::JNIEnv& env, const std::vector<mbgl::Feature>& value) const {
using namespace mbgl::android::geojson;
- auto features = jni::Array<jni::Object<Feature>>::New(env, value.size(), Feature::javaClass);
- for(size_t i = 0; i < value.size(); i = i + 1) {
- auto converted = *convert<jni::Object<android::geojson::Feature>, mbgl::Feature>(env, value.at(i));
- features.Set(env, i, converted);
- jni::DeleteLocalRef(env, converted);
+ auto features = jni::Array<jni::Object<Feature>>::New(env, value.size());
+
+ for (size_t i = 0; i < value.size(); i = i + 1) {
+ features.Set(env, i, *jni::SeizeLocal(env, convertFeature(env, value.at(i))));
}
return {features};
diff --git a/platform/android/src/geojson/conversion/feature.hpp b/platform/android/src/geojson/conversion/feature.hpp
index 031449cd23..d9fc0a0b67 100644
--- a/platform/android/src/geojson/conversion/feature.hpp
+++ b/platform/android/src/geojson/conversion/feature.hpp
@@ -7,23 +7,12 @@
#include <jni/jni.hpp>
#include <vector>
-#include <unordered_map>
namespace mbgl {
namespace android {
namespace conversion {
template <>
-struct Converter<jni::jobject*, std::unordered_map<std::string, mbgl::Value>> {
- Result<jni::jobject*> operator()(jni::JNIEnv& env, const std::unordered_map<std::string, mbgl::Value>& value) const;
-};
-
-template <>
-struct Converter<jni::Object<android::geojson::Feature>, mbgl::Feature> {
- Result<jni::Object<android::geojson::Feature>> operator()(jni::JNIEnv& env, const mbgl::Feature& value) const;
-};
-
-template <>
struct Converter<jni::Array<jni::Object<android::geojson::Feature>>, std::vector<mbgl::Feature>> {
Result<jni::Array<jni::Object<android::geojson::Feature>>> operator()(jni::JNIEnv& env, const std::vector<mbgl::Feature>& value) const;
};
diff --git a/platform/android/src/geojson/feature.cpp b/platform/android/src/geojson/feature.cpp
index d8a4e829e2..1e02c756eb 100644
--- a/platform/android/src/geojson/feature.cpp
+++ b/platform/android/src/geojson/feature.cpp
@@ -7,57 +7,50 @@ namespace android {
namespace geojson {
mbgl::Feature Feature::convert(jni::JNIEnv& env, jni::Object<Feature> jFeature) {
- // Convert
- auto jGeometry = geometry(env, jFeature);
- auto jProperties = Feature::properties(env, jFeature);
+ auto jGeometry = jni::SeizeLocal(env, geometry(env, jFeature));
+ auto jProperties = jni::SeizeLocal(env, Feature::properties(env, jFeature));
std::experimental::optional<mapbox::geometry::identifier> id;
- auto jId = Feature::id(env, jFeature);
+ auto jId = jni::SeizeLocal(env, Feature::id(env, jFeature));
if (jId) {
- id = { jni::Make<std::string>(env, jId) };
+ id = { jni::Make<std::string>(env, *jId) };
}
- auto feature = mbgl::Feature {
- Geometry::convert(env, jGeometry),
- gson::JsonObject::convert(env, jProperties),
- id
+ return mbgl::Feature {
+ Geometry::convert(env, *jGeometry),
+ gson::JsonObject::convert(env, *jProperties),
+ id
};
-
- // Cleanup
- jni::DeleteLocalRef(env, jGeometry);
- jni::DeleteLocalRef(env, jProperties);
- jni::DeleteLocalRef(env, jId);
-
- return feature;
}
jni::Object<Geometry> Feature::geometry(jni::JNIEnv& env, jni::Object<Feature> jFeature) {
- static auto method = Feature::javaClass.GetMethod<jni::Object<Geometry> ()>(env, "geometry");
+ static auto javaClass = jni::Class<Feature>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<Geometry> ()>(env, "geometry");
return jFeature.Call(env, method);
}
jni::Object<gson::JsonObject> Feature::properties(jni::JNIEnv& env, jni::Object<Feature> jFeature) {
- static auto method = Feature::javaClass.GetMethod<jni::Object<gson::JsonObject> ()>(env, "properties");
+ static auto javaClass = jni::Class<Feature>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<gson::JsonObject> ()>(env, "properties");
return jFeature.Call(env, method);
}
jni::String Feature::id(jni::JNIEnv& env, jni::Object<Feature> jFeature) {
- static auto method = Feature::javaClass.GetMethod<jni::String ()>(env, "id");
+ static auto javaClass = jni::Class<Feature>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::String ()>(env, "id");
return jFeature.Call(env, method);
}
jni::Object<Feature> Feature::fromGeometry(jni::JNIEnv& env, jni::Object<Geometry> geometry, jni::Object<gson::JsonObject> properties, jni::String id) {
- static auto method = Feature::javaClass.GetStaticMethod<jni::Object<Feature> (jni::Object<Geometry>, jni::Object<gson::JsonObject>, jni::String)>(env, "fromGeometry");
- return Feature::javaClass.Call(env, method, geometry, properties, id);
+ static auto javaClass = jni::Class<Feature>::Singleton(env);
+ static auto method = javaClass.GetStaticMethod<jni::Object<Feature> (jni::Object<Geometry>, jni::Object<gson::JsonObject>, jni::String)>(env, "fromGeometry");
+ return javaClass.Call(env, method, geometry, properties, id);
}
void Feature::registerNative(jni::JNIEnv& env) {
- // Lookup the class
- Feature::javaClass = *jni::Class<Feature>::Find(env).NewGlobalRef(env).release();
+ jni::Class<Feature>::Singleton(env);
}
-jni::Class<Feature> Feature::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/feature.hpp b/platform/android/src/geojson/feature.hpp
index ab59d783e5..de38e9b1e3 100644
--- a/platform/android/src/geojson/feature.hpp
+++ b/platform/android/src/geojson/feature.hpp
@@ -28,10 +28,7 @@ public:
static jni::Object<gson::JsonObject> properties(jni::JNIEnv&, jni::Object<Feature>);
- static jni::Class<Feature> javaClass;
-
static void registerNative(jni::JNIEnv&);
-
};
} // namespace geojson
diff --git a/platform/android/src/geojson/feature_collection.cpp b/platform/android/src/geojson/feature_collection.cpp
index 18a41d48fa..c2825e037b 100644
--- a/platform/android/src/geojson/feature_collection.cpp
+++ b/platform/android/src/geojson/feature_collection.cpp
@@ -10,35 +10,28 @@ mbgl::FeatureCollection FeatureCollection::convert(jni::JNIEnv& env, jni::Object
auto collection = mbgl::FeatureCollection();
if (jCollection) {
- auto jFeatureList = FeatureCollection::features(env, jCollection);
- auto jFeatures = java::util::List::toArray<Feature>(env, jFeatureList);
- auto size = size_t(jFeatures.Length(env));
+ auto jFeatureList = jni::SeizeLocal(env, FeatureCollection::features(env, jCollection));
+ auto jFeatures = jni::SeizeLocal(env, java::util::List::toArray<Feature>(env, *jFeatureList));
+ auto size = size_t(jFeatures->Length(env));
collection.reserve(size);
for (size_t i = 0; i < size; i++) {
- auto jFeature = jFeatures.Get(env, i);
- collection.push_back(Feature::convert(env, jFeature));
- jni::DeleteLocalRef(env, jFeature);
+ collection.push_back(Feature::convert(env, *jni::SeizeLocal(env, jFeatures->Get(env, i))));
}
-
- jni::DeleteLocalRef(env, jFeatures);
- jni::DeleteLocalRef(env, jFeatureList);
}
return collection;
}
jni::Object<java::util::List> FeatureCollection::features(jni::JNIEnv& env, jni::Object<FeatureCollection> jCollection) {
- static auto method = FeatureCollection::javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "features");
+ static auto javaClass = jni::Class<FeatureCollection>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "features");
return jCollection.Call(env, method);
}
void FeatureCollection::registerNative(jni::JNIEnv& env) {
- // Lookup the class
- javaClass = *jni::Class<FeatureCollection>::Find(env).NewGlobalRef(env).release();
+ jni::Class<FeatureCollection>::Singleton(env);
}
-jni::Class<FeatureCollection> FeatureCollection::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/feature_collection.hpp b/platform/android/src/geojson/feature_collection.hpp
index 259ffab370..1b45cca5de 100644
--- a/platform/android/src/geojson/feature_collection.hpp
+++ b/platform/android/src/geojson/feature_collection.hpp
@@ -19,8 +19,6 @@ public:
static jni::Object<java::util::List> features(jni::JNIEnv&, jni::Object<FeatureCollection>);
- static jni::Class<FeatureCollection> javaClass;
-
static void registerNative(jni::JNIEnv&);
};
diff --git a/platform/android/src/geojson/geometry.cpp b/platform/android/src/geojson/geometry.cpp
index 5635b5a0f5..4262b4ee69 100644
--- a/platform/android/src/geojson/geometry.cpp
+++ b/platform/android/src/geojson/geometry.cpp
@@ -23,31 +23,31 @@ public:
jni::JNIEnv& env;
jni::Object<Geometry> operator()(const mbgl::Point<double> &geometry) const {
- return jni::Cast(env, Point::New(env, geometry), Geometry::javaClass);
+ return Point::New(env, geometry);
}
jni::Object<Geometry> operator()(const mbgl::LineString<double> &geometry) const {
- return jni::Cast(env, LineString::New(env, geometry), Geometry::javaClass);
+ return LineString::New(env, geometry);
}
jni::Object<Geometry> operator()(const mbgl::MultiLineString<double> &geometry) const {
- return jni::Cast(env, MultiLineString::New(env, geometry), Geometry::javaClass);
+ return MultiLineString::New(env, geometry);
}
jni::Object<Geometry> operator()(const mbgl::MultiPoint<double> &geometry) const {
- return jni::Cast(env, MultiPoint::New(env, geometry), Geometry::javaClass);
+ return MultiPoint::New(env, geometry);
}
jni::Object<Geometry> operator()(const mbgl::Polygon<double> &geometry) const {
- return jni::Cast(env, Polygon::New(env, geometry), Geometry::javaClass);
+ return Polygon::New(env, geometry);
}
jni::Object<Geometry> operator()(const mbgl::MultiPolygon<double> &geometry) const {
- return jni::Cast(env, MultiPolygon::New(env, geometry), Geometry::javaClass);
+ return MultiPolygon::New(env, geometry);
}
jni::Object<Geometry> operator()(const mapbox::geometry::geometry_collection<double> &geometry) const {
- return jni::Cast(env, GeometryCollection::New(env, geometry), Geometry::javaClass);
+ return GeometryCollection::New(env, geometry);
}
};
@@ -78,20 +78,15 @@ mbgl::Geometry<double> Geometry::convert(jni::JNIEnv &env, jni::Object<Geometry>
}
std::string Geometry::getType(jni::JNIEnv &env, jni::Object<Geometry> jGeometry) {
- static auto method = Geometry::javaClass.GetMethod<jni::String ()>(env, "type");
- auto jType = jGeometry.Call(env, method);
- auto type = jni::Make<std::string>(env, jType);
- jni::DeleteLocalRef(env, jType);
- return type;
+ static auto javaClass = jni::Class<Geometry>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::String ()>(env, "type");
+ return jni::Make<std::string>(env, *jni::SeizeLocal(env, jGeometry.Call(env, method)));
}
void Geometry::registerNative(jni::JNIEnv &env) {
- // Lookup the class
- javaClass = *jni::Class<Geometry>::Find(env).NewGlobalRef(env).release();
+ jni::Class<Geometry>::Singleton(env);
}
-jni::Class<Geometry> Geometry::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/geometry.hpp b/platform/android/src/geojson/geometry.hpp
index a1bb886683..836c3bd5a0 100644
--- a/platform/android/src/geojson/geometry.hpp
+++ b/platform/android/src/geojson/geometry.hpp
@@ -1,7 +1,6 @@
#pragma once
#include <mbgl/util/geometry.hpp>
-#include <mbgl/util/noncopyable.hpp>
#include "../java/util.hpp"
@@ -11,7 +10,7 @@ namespace mbgl {
namespace android {
namespace geojson {
-class Geometry : private mbgl::util::noncopyable {
+class Geometry {
public:
static constexpr auto Name() { return "com/mapbox/geojson/Geometry"; };
@@ -21,8 +20,6 @@ public:
static std::string getType(jni::JNIEnv&, jni::Object<Geometry>);
- static jni::Class<Geometry> javaClass;
-
static void registerNative(jni::JNIEnv&);
};
diff --git a/platform/android/src/geojson/geometry_collection.cpp b/platform/android/src/geojson/geometry_collection.cpp
index 770cb9a5d6..ad0af71214 100644
--- a/platform/android/src/geojson/geometry_collection.cpp
+++ b/platform/android/src/geojson/geometry_collection.cpp
@@ -7,57 +7,43 @@ namespace geojson {
jni::Object<GeometryCollection> GeometryCollection::New(jni::JNIEnv& env, const mapbox::geometry::geometry_collection<double>& collection) {
// Create an array of geometries
- auto jarray = jni::Array<jni::Object<Geometry>>::New(env, collection.size(), Geometry::javaClass);
+ auto jarray = jni::SeizeLocal(env, jni::Array<jni::Object<Geometry>>::New(env, collection.size()));
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);
+ jarray->Set(env, i, *jni::SeizeLocal(env, Geometry::New(env, collection.at(i))));
}
- // Turn into array list
- auto jList = java::util::Arrays::asList(env, jarray);
- jni::DeleteLocalRef(env, jarray);
-
// create the GeometryCollection
+ static auto javaClass = jni::Class<GeometryCollection>::Singleton(env);
static auto method = javaClass.GetStaticMethod<jni::Object<GeometryCollection> (jni::Object<java::util::List>)>(env, "fromGeometries");
- auto jCollection = javaClass.Call(env, method, jList);
-
- jni::DeleteLocalRef(env, jList);
- return jCollection;
+ return javaClass.Call(env, method, *jni::SeizeLocal(env, java::util::Arrays::asList(env, *jarray)));
}
mapbox::geometry::geometry_collection<double> GeometryCollection::convert(jni::JNIEnv &env, jni::Object<GeometryCollection> jCollection) {
// Get geometries
+ static auto javaClass = jni::Class<GeometryCollection>::Singleton(env);
static auto getGeometries = javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "geometries");
- auto jList = jCollection.Call(env, getGeometries);
// Turn into array
- auto jarray = java::util::List::toArray<Geometry>(env, jList);
- jni::DeleteLocalRef(env, jList);
+ auto jarray = jni::SeizeLocal(env,
+ java::util::List::toArray<Geometry>(env,
+ *jni::SeizeLocal(env, jCollection.Call(env, getGeometries))));
// Convert each geometry
mapbox::geometry::geometry_collection<double> collection{};
- auto size = jarray.Length(env);
+ 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);
+ collection.push_back(Geometry::convert(env, *jni::SeizeLocal(env, jarray->Get(env, i))));
}
- jni::DeleteLocalRef(env, jarray);
return collection;
}
void GeometryCollection::registerNative(jni::JNIEnv &env) {
- // Lookup the class
- javaClass = *jni::Class<GeometryCollection>::Find(env).NewGlobalRef(env).release();
+ jni::Class<GeometryCollection>::Singleton(env);
}
-jni::Class<GeometryCollection> GeometryCollection::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/geometry_collection.hpp b/platform/android/src/geojson/geometry_collection.hpp
index 9ed9953b0d..a301d86933 100644
--- a/platform/android/src/geojson/geometry_collection.hpp
+++ b/platform/android/src/geojson/geometry_collection.hpp
@@ -18,8 +18,6 @@ public:
static mapbox::geometry::geometry_collection<double> convert(jni::JNIEnv&, jni::Object<GeometryCollection>);
- static jni::Class<GeometryCollection> javaClass;
-
static void registerNative(jni::JNIEnv&);
};
diff --git a/platform/android/src/geojson/line_string.cpp b/platform/android/src/geojson/line_string.cpp
index a5f1a468ce..5a18a02bb7 100644
--- a/platform/android/src/geojson/line_string.cpp
+++ b/platform/android/src/geojson/line_string.cpp
@@ -8,22 +8,18 @@ namespace android {
namespace geojson {
jni::Object<LineString> LineString::New(jni::JNIEnv& env, const mbgl::LineString<double>& lineString) {
- auto jList = asPointsList(env, lineString);
-
+ static auto javaClass = jni::Class<LineString>::Singleton(env);
static auto method = javaClass.GetStaticMethod<jni::Object<LineString>(jni::Object<java::util::List>)>(env, "fromLngLats");
- auto jLineString = javaClass.Call(env, method, jList);
- jni::DeleteLocalRef(env, jList);
- return jLineString;
+ return javaClass.Call(env, method,
+ *jni::SeizeLocal(env, asPointsList(env, lineString)));
}
mapbox::geojson::line_string LineString::convert(jni::JNIEnv &env, jni::Object<LineString> jLineString) {
mapbox::geojson::line_string lineString;
if (jLineString) {
- auto jPointList = LineString::coordinates(env, jLineString);
- lineString = LineString::convert(env, jPointList);
- jni::DeleteLocalRef(env, jPointList);
+ lineString = LineString::convert(env, *jni::SeizeLocal(env, LineString::coordinates(env, jLineString)));
}
return lineString;
@@ -33,34 +29,28 @@ mapbox::geojson::line_string LineString::convert(jni::JNIEnv &env, jni::Object<j
mapbox::geojson::line_string lineString;
if (jPointList) {
- auto jPointArray = java::util::List::toArray<Point>(env, jPointList);
- auto size = jPointArray.Length(env);
+ auto jPointArray = jni::SeizeLocal(env, java::util::List::toArray<Point>(env, jPointList));
+ auto size = jPointArray->Length(env);
lineString.reserve(size);
for (std::size_t i = 0; i < size; i++) {
- auto jPoint = jPointArray.Get(env, i);
- lineString.push_back(Point::convert(env, jPoint));
- jni::DeleteLocalRef(env, jPoint);
+ lineString.push_back(Point::convert(env, *jni::SeizeLocal(env, jPointArray->Get(env, i))));
}
-
- jni::DeleteLocalRef(env, jPointArray);
}
return lineString;
}
jni::Object<java::util::List> LineString::coordinates(jni::JNIEnv &env, jni::Object<LineString> jLineString) {
- static auto method = LineString::javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
+ static auto javaClass = jni::Class<LineString>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
return jLineString.Call(env, method);
}
void LineString::registerNative(jni::JNIEnv &env) {
- // Lookup the class
- javaClass = *jni::Class<LineString>::Find(env).NewGlobalRef(env).release();
+ jni::Class<LineString>::Singleton(env);
}
-jni::Class<LineString> LineString::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/line_string.hpp b/platform/android/src/geojson/line_string.hpp
index 98dc414642..4df9349185 100644
--- a/platform/android/src/geojson/line_string.hpp
+++ b/platform/android/src/geojson/line_string.hpp
@@ -28,8 +28,6 @@ public:
static jni::Object<java::util::List> coordinates(jni::JNIEnv&, jni::Object<LineString>);
- static jni::Class<LineString> javaClass;
-
static void registerNative(jni::JNIEnv&);
};
diff --git a/platform/android/src/geojson/multi_line_string.cpp b/platform/android/src/geojson/multi_line_string.cpp
index 4a6ea37dd1..0a0974062c 100644
--- a/platform/android/src/geojson/multi_line_string.cpp
+++ b/platform/android/src/geojson/multi_line_string.cpp
@@ -8,22 +8,19 @@ namespace android {
namespace geojson {
jni::Object<MultiLineString> MultiLineString::New(jni::JNIEnv& env, const mbgl::MultiLineString<double>& multiLineString) {
- auto jList = asPointsListsList(env, multiLineString);
-
+ static auto javaClass = jni::Class<MultiLineString>::Singleton(env);
static auto method = javaClass.GetStaticMethod<jni::Object<MultiLineString> (jni::Object<java::util::List>)>(env, "fromLngLats");
- auto jMultiLineString = javaClass.Call(env, method, jList);
- jni::DeleteLocalRef(env, jList);
- return jMultiLineString;
+ return javaClass.Call(env, method,
+ *jni::SeizeLocal(env, asPointsListsList(env, multiLineString)));
}
mapbox::geojson::multi_line_string MultiLineString::convert(jni::JNIEnv &env, jni::Object<MultiLineString> jMultiLineString) {
mapbox::geojson::multi_line_string multiLineString;
if (jMultiLineString) {
- auto jPointListsList = MultiLineString::coordinates(env, jMultiLineString);
- multiLineString = MultiLineString::convert(env, jPointListsList);
- jni::DeleteLocalRef(env, jPointListsList);
+ multiLineString = MultiLineString::convert(env,
+ *jni::SeizeLocal(env, MultiLineString::coordinates(env, jMultiLineString)));
}
return multiLineString;
@@ -33,35 +30,29 @@ mapbox::geojson::multi_line_string MultiLineString::convert(jni::JNIEnv &env, jn
mapbox::geojson::multi_line_string multiLineString;
if (jPointListsList) {
- auto jPositionListsArray = java::util::List::toArray<java::util::List>(env, jPointListsList);
+ auto jPositionListsArray = jni::SeizeLocal(env, java::util::List::toArray<java::util::List>(env, jPointListsList));
- auto size = jPositionListsArray.Length(env);
+ auto size = jPositionListsArray->Length(env);
multiLineString.reserve(size);
for (std::size_t i = 0; i < size; i++) {
- auto jPointsList = jPositionListsArray.Get(env, i);
- multiLineString.push_back(LineString::convert(env, jPointsList));
- jni::DeleteLocalRef(env, jPointsList);
+ multiLineString.push_back(LineString::convert(env, *jni::SeizeLocal(env, jPositionListsArray->Get(env, i))));
}
-
- jni::DeleteLocalRef(env, jPositionListsArray);
}
return multiLineString;
}
jni::Object<java::util::List> MultiLineString::coordinates(jni::JNIEnv &env, jni::Object<MultiLineString> jLineString) {
- static auto method = MultiLineString::javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
+ static auto javaClass = jni::Class<MultiLineString>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
return jLineString.Call(env, method);
}
void MultiLineString::registerNative(jni::JNIEnv &env) {
- // Lookup the class
- javaClass = *jni::Class<MultiLineString>::Find(env).NewGlobalRef(env).release();
+ jni::Class<MultiLineString>::Singleton(env);
}
-jni::Class<MultiLineString> MultiLineString::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/multi_line_string.hpp b/platform/android/src/geojson/multi_line_string.hpp
index 934a0cb6b5..c66aadaf03 100644
--- a/platform/android/src/geojson/multi_line_string.hpp
+++ b/platform/android/src/geojson/multi_line_string.hpp
@@ -26,8 +26,6 @@ public:
static jni::Object<java::util::List> coordinates(jni::JNIEnv&, jni::Object<MultiLineString>);
- static jni::Class<MultiLineString> javaClass;
-
static void registerNative(jni::JNIEnv&);
};
diff --git a/platform/android/src/geojson/multi_point.cpp b/platform/android/src/geojson/multi_point.cpp
index 6f62541209..5f51058f38 100644
--- a/platform/android/src/geojson/multi_point.cpp
+++ b/platform/android/src/geojson/multi_point.cpp
@@ -9,39 +9,33 @@ namespace android {
namespace geojson {
jni::Object<MultiPoint> MultiPoint::New(JNIEnv& env, const mbgl::MultiPoint<double>& multiPoint) {
- auto jList = asPointsList(env, multiPoint);
-
+ static auto javaClass = jni::Class<MultiPoint>::Singleton(env);
static auto method = javaClass.GetStaticMethod<jni::Object<MultiPoint>(jni::Object<java::util::List>)>(env, "fromLngLats");
- auto jMultiPoint = javaClass.Call(env, method, jList);
- jni::DeleteLocalRef(env, jList);
- return jMultiPoint;
+ return javaClass.Call(env, method, *jni::SeizeLocal(env, asPointsList(env, multiPoint)));
}
mapbox::geojson::multi_point MultiPoint::convert(jni::JNIEnv &env, jni::Object<MultiPoint> jMultiPoint) {
mapbox::geojson::multi_point multiPoint;
if (jMultiPoint) {
- auto jPointListsList = MultiPoint::coordinates(env, jMultiPoint);
- multiPoint = convertExplicit<mapbox::geojson::multi_point>(LineString::convert(env, jPointListsList));
- jni::DeleteLocalRef(env, jPointListsList);
+ multiPoint = convertExplicit<mapbox::geojson::multi_point>(
+ LineString::convert(env, *jni::SeizeLocal(env, MultiPoint::coordinates(env, jMultiPoint))));
}
return multiPoint;
}
jni::Object<java::util::List> MultiPoint::coordinates(jni::JNIEnv &env, jni::Object<MultiPoint> jMultiPoint) {
- static auto method = MultiPoint::javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
+ static auto javaClass = jni::Class<MultiPoint>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
return jMultiPoint.Call(env, method);
}
void MultiPoint::registerNative(jni::JNIEnv &env) {
- // Lookup the class
- javaClass = *jni::Class<MultiPoint>::Find(env).NewGlobalRef(env).release();
+ jni::Class<MultiPoint>::Singleton(env);
}
-jni::Class<MultiPoint> MultiPoint::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/multi_point.hpp b/platform/android/src/geojson/multi_point.hpp
index cfe80cd34c..0df16bfd6a 100644
--- a/platform/android/src/geojson/multi_point.hpp
+++ b/platform/android/src/geojson/multi_point.hpp
@@ -25,8 +25,6 @@ public:
static jni::Object<java::util::List> coordinates(jni::JNIEnv&, jni::Object<MultiPoint>);
- static jni::Class<MultiPoint> javaClass;
-
static void registerNative(jni::JNIEnv&);
};
diff --git a/platform/android/src/geojson/multi_polygon.cpp b/platform/android/src/geojson/multi_polygon.cpp
index cc872d4955..109ac714c3 100644
--- a/platform/android/src/geojson/multi_polygon.cpp
+++ b/platform/android/src/geojson/multi_polygon.cpp
@@ -8,62 +8,48 @@ namespace android {
namespace geojson {
jni::Object<MultiPolygon> MultiPolygon::New(JNIEnv& env, const mbgl::MultiPolygon<double>& multiPolygon) {
- auto jarray = jni::Array<jni::Object<java::util::List>>::New(env, multiPolygon.size(), java::util::List::javaClass);
+ static auto javaClass = jni::Class<MultiPolygon>::Singleton(env);
+ static auto method = javaClass.GetStaticMethod<jni::Object<MultiPolygon> (jni::Object<java::util::List>)>(env, "fromLngLats");
+
+ auto jarray = jni::SeizeLocal(env,
+ jni::Array<jni::Object<java::util::List>>::New(env, multiPolygon.size()));
for (size_t i = 0; i < multiPolygon.size(); i++) {
- auto& geometry = multiPolygon.at(i);
- auto jPolygon = asPointsListsList(env, geometry);
- jarray.Set(env, i, jPolygon);
- jni::DeleteLocalRef(env, jPolygon);
+ jarray->Set(env, i, *jni::SeizeLocal(env, asPointsListsList(env, multiPolygon.at(i))));
}
- // Turn into array list
- auto jList = java::util::Arrays::asList(env, jarray);
- jni::DeleteLocalRef(env, jarray);
-
- // create the MultiPolygon
- static auto method = javaClass.GetStaticMethod<jni::Object<MultiPolygon> (jni::Object<java::util::List>)>(env, "fromLngLats");
- auto jMultiPolygon = javaClass.Call(env, method, jList);
-
- jni::DeleteLocalRef(env, jList);
- return jMultiPolygon;
+ return javaClass.Call(env, method,
+ *jni::SeizeLocal(env, java::util::Arrays::asList(env, *jarray)));
}
mapbox::geojson::multi_polygon MultiPolygon::convert(jni::JNIEnv &env, jni::Object<MultiPolygon> jMultiPolygon) {
mapbox::geojson::multi_polygon multiPolygon;
if (jMultiPolygon) {
- auto jPointListsListList = MultiPolygon::coordinates(env, jMultiPolygon);
- auto jPointListsListArray = java::util::List::toArray<java::util::List>(env, jPointListsListList);
+ auto jPointListsListList = jni::SeizeLocal(env, MultiPolygon::coordinates(env, jMultiPolygon));
+ auto jPointListsListArray = jni::SeizeLocal(env, java::util::List::toArray<java::util::List>(env, *jPointListsListList));
- auto size = jPointListsListArray.Length(env);
+ auto size = jPointListsListArray->Length(env);
multiPolygon.reserve(size);
for (size_t i = 0; i < size; i++) {
- auto jPositionListsList = jPointListsListArray.Get(env, i);
- multiPolygon.push_back(Polygon::convert(env, jPositionListsList));
- jni::DeleteLocalRef(env, jPositionListsList);
+ multiPolygon.push_back(Polygon::convert(env, *jni::SeizeLocal(env, jPointListsListArray->Get(env, i))));
}
-
- jni::DeleteLocalRef(env, jPointListsListArray);
- jni::DeleteLocalRef(env, jPointListsListList);
}
return multiPolygon;
}
jni::Object<java::util::List> MultiPolygon::coordinates(jni::JNIEnv &env, jni::Object<MultiPolygon> jPolygon) {
- static auto method = MultiPolygon::javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
+ static auto javaClass = jni::Class<MultiPolygon>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
return jPolygon.Call(env, method);
}
void MultiPolygon::registerNative(jni::JNIEnv &env) {
- // Lookup the class
- javaClass = *jni::Class<MultiPolygon>::Find(env).NewGlobalRef(env).release();
+ jni::Class<MultiPolygon>::Singleton(env);
}
-jni::Class<MultiPolygon> MultiPolygon::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/multi_polygon.hpp b/platform/android/src/geojson/multi_polygon.hpp
index b4657af09d..3477e989ea 100644
--- a/platform/android/src/geojson/multi_polygon.hpp
+++ b/platform/android/src/geojson/multi_polygon.hpp
@@ -24,8 +24,6 @@ public:
static jni::Object<java::util::List> coordinates(jni::JNIEnv&, jni::Object<MultiPolygon>);
- static jni::Class<MultiPolygon> javaClass;
-
static void registerNative(jni::JNIEnv&);
};
diff --git a/platform/android/src/geojson/point.cpp b/platform/android/src/geojson/point.cpp
index 8a9656ea14..69da997250 100644
--- a/platform/android/src/geojson/point.cpp
+++ b/platform/android/src/geojson/point.cpp
@@ -8,6 +8,7 @@ namespace android {
namespace geojson {
jni::Object<Point> Point::New(jni::JNIEnv& env, const mbgl::Point<double>& point) {
+ static auto javaClass = jni::Class<Point>::Singleton(env);
static auto method = javaClass.GetStaticMethod<jni::Object<Point> (jni::jdouble, jni::jdouble)>(env, "fromLngLat");
return javaClass.Call(env, method, point.x, point.y);
}
@@ -16,9 +17,7 @@ mapbox::geojson::point Point::convert(jni::JNIEnv &env, jni::Object<Point> jPoin
mapbox::geojson::point point;
if (jPoint) {
- auto jDoubleList = Point::coordinates(env, jPoint);
- point = Point::convert(env, jDoubleList);
- jni::DeleteLocalRef(env, jDoubleList);
+ point = Point::convert(env, *jni::SeizeLocal(env, Point::coordinates(env, jPoint)));
}
return point;
@@ -28,35 +27,29 @@ mapbox::geojson::point Point::convert(jni::JNIEnv &env, jni::Object<java::util::
mapbox::geojson::point point;
if (jDoubleList) {
- auto jDoubleArray = java::util::List::toArray<jobject>(env, jDoubleList);
+ auto jDoubleArray = jni::SeizeLocal(env, java::util::List::toArray<jobject>(env, jDoubleList));
- auto lonObject = jDoubleArray.Get(env, 0);
- auto latObject = jDoubleArray.Get(env, 1);
+ auto lonObject = jni::SeizeLocal(env, jDoubleArray->Get(env, 0));
+ auto latObject = jni::SeizeLocal(env, jDoubleArray->Get(env, 1));
- point.x = jni::CallMethod<jni::jdouble>(env, lonObject,
+ point.x = jni::CallMethod<jni::jdouble>(env, *lonObject,
*java::Number::doubleValueMethodId);
- point.y = jni::CallMethod<jni::jdouble>(env, latObject,
+ point.y = jni::CallMethod<jni::jdouble>(env, *latObject,
*java::Number::doubleValueMethodId);
-
- jni::DeleteLocalRef(env, lonObject);
- jni::DeleteLocalRef(env, latObject);
- jni::DeleteLocalRef(env, jDoubleArray);
}
return point;
}
jni::Object<java::util::List> Point::coordinates(jni::JNIEnv &env, jni::Object<Point> jPoint) {
- static auto method = Point::javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
- return jPoint.Call(env, method);
+ static auto javaClass = jni::Class<Point>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
+ return jPoint.Call(env, method);
}
void Point::registerNative(jni::JNIEnv &env) {
- // Lookup the class
- javaClass = *jni::Class<Point>::Find(env).NewGlobalRef(env).release();
+ jni::Class<Point>::Singleton(env);
}
-jni::Class<Point> Point::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl
diff --git a/platform/android/src/geojson/point.hpp b/platform/android/src/geojson/point.hpp
index 627bd1b649..3a852a3e74 100644
--- a/platform/android/src/geojson/point.hpp
+++ b/platform/android/src/geojson/point.hpp
@@ -26,8 +26,6 @@ public:
static jni::Object<java::util::List> coordinates(JNIEnv&, jni::Object<Point>);
- static jni::Class<Point> javaClass;
-
static void registerNative(jni::JNIEnv&);
};
diff --git a/platform/android/src/geojson/polygon.cpp b/platform/android/src/geojson/polygon.cpp
index 96058b63b3..add843e294 100644
--- a/platform/android/src/geojson/polygon.cpp
+++ b/platform/android/src/geojson/polygon.cpp
@@ -9,22 +9,17 @@ namespace android {
namespace geojson {
jni::Object<Polygon> Polygon::New(jni::JNIEnv& env, const mbgl::Polygon<double>& polygon) {
- auto jList = asPointsListsList(env, polygon);
-
+ static auto javaClass = jni::Class<Polygon>::Singleton(env);
static auto method = javaClass.GetStaticMethod<jni::Object<Polygon> (jni::Object<java::util::List>)>(env, "fromLngLats");
- auto jPolygon = javaClass.Call(env, method, jList);
- jni::DeleteLocalRef(env, jList);
- return jPolygon;
+ return javaClass.Call(env, method, *jni::SeizeLocal(env, asPointsListsList(env, polygon)));
}
mapbox::geojson::polygon Polygon::convert(jni::JNIEnv &env, jni::Object<Polygon> jPolygon) {
mapbox::geojson::polygon polygon;
if (jPolygon) {
- auto jPositionListsList = Polygon::coordinates(env, jPolygon);
- polygon = Polygon::convert(env, jPositionListsList);
- jni::DeleteLocalRef(env, jPositionListsList);
+ polygon = Polygon::convert(env, *jni::SeizeLocal(env, Polygon::coordinates(env, jPolygon)));
}
return polygon;
@@ -46,17 +41,15 @@ mapbox::geojson::polygon Polygon::convert(jni::JNIEnv &env, jni::Object<java::ut
jni::Object<java::util::List> Polygon::coordinates(jni::JNIEnv &env, jni::Object<Polygon> jPolygon) {
- static auto method = Polygon::javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
+ static auto javaClass = jni::Class<Polygon>::Singleton(env);
+ static auto method = javaClass.GetMethod<jni::Object<java::util::List> ()>(env, "coordinates");
return jPolygon.Call(env, method);
}
void Polygon::registerNative(jni::JNIEnv &env) {
- // Lookup the class
- javaClass = *jni::Class<Polygon>::Find(env).NewGlobalRef(env).release();
+ jni::Class<Polygon>::Singleton(env);
}
-jni::Class<Polygon> Polygon::javaClass;
-
} // namespace geojson
} // namespace android
} // namespace mbgl \ No newline at end of file
diff --git a/platform/android/src/geojson/polygon.hpp b/platform/android/src/geojson/polygon.hpp
index f3c23b4d7b..adfa60df4d 100644
--- a/platform/android/src/geojson/polygon.hpp
+++ b/platform/android/src/geojson/polygon.hpp
@@ -27,8 +27,6 @@ public:
static jni::Object<java::util::List> coordinates(jni::JNIEnv&, jni::Object<Polygon>);
- static jni::Class<Polygon> javaClass;
-
static void registerNative(jni::JNIEnv &);
};
diff --git a/platform/android/src/geojson/util.hpp b/platform/android/src/geojson/util.hpp
index 5e6d90a953..e889931c56 100644
--- a/platform/android/src/geojson/util.hpp
+++ b/platform/android/src/geojson/util.hpp
@@ -24,17 +24,13 @@ To convertExplicit(From&& src) {
*/
template <class T>
static jni::Object<java::util::List> asPointsList(jni::JNIEnv& env, const T& pointsList) {
- auto jarray = jni::Array<jni::Object<Point>>::New(env, pointsList.size(), Point::javaClass);
+ auto jarray = jni::SeizeLocal(env, jni::Array<jni::Object<Point>>::New(env, pointsList.size()));
for (jni::jsize i = 0; i < pointsList.size(); i++) {
- auto jPoint = Point::New(env, pointsList.at(i));
- jarray.Set(env, i, jPoint);
- jni::DeleteLocalRef(env, jPoint);
+ jarray->Set(env, i, *jni::SeizeLocal(env, Point::New(env, pointsList.at(i))));
}
- auto jList = java::util::Arrays::asList(env, jarray);
- jni::DeleteLocalRef(env, jarray);
- return jList;
+ return java::util::Arrays::asList(env, *jarray);
}
/**
@@ -42,17 +38,13 @@ static jni::Object<java::util::List> asPointsList(jni::JNIEnv& env, const T& poi
*/
template <class SHAPE>
static jni::Object<java::util::List> asPointsListsList(JNIEnv& env, SHAPE value) {
- auto jarray = jni::Array<jni::Object<java::util::List>>::New(env, value.size(), java::util::List::javaClass);
+ auto jarray = jni::SeizeLocal(env, jni::Array<jni::Object<java::util::List>>::New(env, value.size()));
- for (size_t i = 0; i < value.size(); i = i + 1) {
- auto pointsList = asPointsList(env, value[i]);
- jarray.Set(env, i, pointsList);
- jni::DeleteLocalRef(env, pointsList);
+ for (size_t i = 0; i < value.size(); i++) {
+ jarray->Set(env, i, *jni::SeizeLocal(env, asPointsList(env, value[i])));
}
- auto jList = java::util::Arrays::asList(env, jarray);
- jni::DeleteLocalRef(env, jarray);
- return jList;
+ return java::util::Arrays::asList(env, *jarray);
}
} // namespace geojson