summaryrefslogtreecommitdiff
path: root/platform/android/src/gson/json_element.cpp
diff options
context:
space:
mode:
authorIvo van Dongen <info@ivovandongen.nl>2017-03-22 15:05:03 +0200
committerIvo van Dongen <ivovandongen@users.noreply.github.com>2017-03-28 15:44:22 +0300
commitfa7489fb7ea8ec85cb746e0bc497518d72c638b9 (patch)
tree477c100890466ca0093af9e101554dca530f9ae8 /platform/android/src/gson/json_element.cpp
parentf70f604e5b99062a24764716ccdeda64c36320be (diff)
downloadqtlocation-mapboxgl-fa7489fb7ea8ec85cb746e0bc497518d72c638b9.tar.gz
[android] geojson conversion optimisation
Diffstat (limited to 'platform/android/src/gson/json_element.cpp')
-rw-r--r--platform/android/src/gson/json_element.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/platform/android/src/gson/json_element.cpp b/platform/android/src/gson/json_element.cpp
new file mode 100644
index 0000000000..060b1e0fe2
--- /dev/null
+++ b/platform/android/src/gson/json_element.cpp
@@ -0,0 +1,62 @@
+#include "json_element.hpp"
+
+#include "json_array.hpp"
+#include "json_object.hpp"
+#include "json_primitive.hpp"
+
+#include <mapbox/geometry/feature.hpp>
+#include <mapbox/variant.hpp>
+
+namespace mbgl {
+namespace android {
+namespace gson {
+
+mapbox::geometry::value JsonElement::convert(jni::JNIEnv &env, jni::Object<JsonElement> jsonElement) {
+ mapbox::geometry::value value;
+
+ if (jsonElement) {
+ if (isJsonPrimitive(env, jsonElement)) {
+ auto primitive = JsonPrimitive::convert(env, jni::Cast(env, jsonElement, JsonPrimitive::javaClass));
+ value = mapbox::util::apply_visitor([](auto t) { return mapbox::geometry::value { t }; }, primitive);
+ } else if (isJsonObject(env, jsonElement)) {
+ mapbox::geometry::property_map map = JsonObject::convert(env, jni::Cast(env, jsonElement, JsonObject::javaClass));
+ value = mapbox::util::recursive_wrapper<std::unordered_map<std::string, mapbox::geometry::value>> { map } ;
+ } else if (isJsonArray(env, jsonElement)) {
+ value = JsonArray::convert(env, jni::Cast(env, jsonElement, JsonArray::javaClass));
+ } else {
+ value = mapbox::geometry::null_value;
+ }
+ }
+ return value;
+}
+
+bool JsonElement::isJsonObject(JNIEnv& env, jni::Object<JsonElement> jsonElement) {
+ static auto method = JsonElement::javaClass.GetMethod<jni::jboolean ()>(env, "isJsonObject");
+ return jsonElement.Call(env, method);
+}
+
+bool JsonElement::isJsonArray(JNIEnv& env, jni::Object<JsonElement> jsonElement) {
+ static auto method = JsonElement::javaClass.GetMethod<jni::jboolean ()>(env, "isJsonArray");
+ return jsonElement.Call(env, method);
+}
+
+bool JsonElement::isJsonPrimitive(JNIEnv& env, jni::Object<JsonElement> jsonElement) {
+ static auto method = JsonElement::javaClass.GetMethod<jni::jboolean ()>(env, "isJsonPrimitive");
+ return jsonElement.Call(env, method);
+}
+
+bool JsonElement::isJsonNull(JNIEnv& env, jni::Object<JsonElement> jsonElement) {
+ static auto method = JsonElement::javaClass.GetMethod<jni::jboolean ()>(env, "isJsonNull");
+ return jsonElement.Call(env, method);
+}
+
+void JsonElement::registerNative(jni::JNIEnv &env) {
+ // Lookup the class
+ javaClass = *jni::Class<JsonElement>::Find(env).NewGlobalRef(env).release();
+}
+
+jni::Class<JsonElement> JsonElement::javaClass;
+
+} // namespace gson
+} // namespace android
+} // namespace mbgl \ No newline at end of file