diff options
author | Tobrun <tobrun@mapbox.com> | 2018-04-10 11:09:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-10 11:09:42 +0200 |
commit | 44ce5ab08792df5f38560016ed3d41712e8025d0 (patch) | |
tree | 83ff99ff7b811e4f54165058df01eb101750c33e /platform/android/src/gson | |
parent | 351ac83c75955c7e44e49a42156ece83b759612b (diff) | |
download | qtlocation-mapboxgl-44ce5ab08792df5f38560016ed3d41712e8025d0.tar.gz |
Rework expression conversion (#11490)
* [android] - rework expression conversion
Diffstat (limited to 'platform/android/src/gson')
-rw-r--r-- | platform/android/src/gson/json_array.cpp | 19 | ||||
-rw-r--r-- | platform/android/src/gson/json_array.hpp | 2 | ||||
-rw-r--r-- | platform/android/src/gson/json_element.cpp | 28 | ||||
-rw-r--r-- | platform/android/src/gson/json_element.hpp | 2 | ||||
-rw-r--r-- | platform/android/src/gson/json_object.cpp | 17 | ||||
-rw-r--r-- | platform/android/src/gson/json_object.hpp | 2 | ||||
-rw-r--r-- | platform/android/src/gson/json_primitive.cpp | 80 | ||||
-rw-r--r-- | platform/android/src/gson/json_primitive.hpp | 2 |
8 files changed, 150 insertions, 2 deletions
diff --git a/platform/android/src/gson/json_array.cpp b/platform/android/src/gson/json_array.cpp index d91e323ac9..e8852d77e9 100644 --- a/platform/android/src/gson/json_array.cpp +++ b/platform/android/src/gson/json_array.cpp @@ -6,7 +6,22 @@ namespace mbgl { namespace android { namespace gson { -std::vector<mapbox::geometry::value> JsonArray::convert(jni::JNIEnv &env, jni::Object<JsonArray> jsonArray) { +jni::Object<JsonArray> JsonArray::New(jni::JNIEnv& env, const std::vector<mapbox::geometry::value>& values){ + static auto constructor = JsonArray::javaClass.GetConstructor(env); + static auto addMethod = JsonArray::javaClass.GetMethod<void (jni::Object<JsonElement>)>(env, "add"); + + auto jsonArray = JsonArray::javaClass.New(env, constructor); + + for (const auto &v : values) { + auto jsonElement = JsonElement::New(env, v); + jsonArray.Call(env, addMethod, jsonElement); + jni::DeleteLocalRef(env, jsonElement); + } + + return jsonArray; +} + +std::vector<mapbox::geometry::value> JsonArray::convert(jni::JNIEnv& env, const jni::Object<JsonArray> jsonArray) { std::vector<mapbox::geometry::value> values; if (jsonArray) { @@ -28,7 +43,7 @@ std::vector<mapbox::geometry::value> JsonArray::convert(jni::JNIEnv &env, jni::O return values; } -void JsonArray::registerNative(jni::JNIEnv &env) { +void JsonArray::registerNative(jni::JNIEnv& env) { // Lookup the class javaClass = *jni::Class<JsonArray>::Find(env).NewGlobalRef(env).release(); } diff --git a/platform/android/src/gson/json_array.hpp b/platform/android/src/gson/json_array.hpp index 8571ad5dba..c9ae98692f 100644 --- a/platform/android/src/gson/json_array.hpp +++ b/platform/android/src/gson/json_array.hpp @@ -13,6 +13,8 @@ class JsonArray : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "com/google/gson/JsonArray"; }; + static jni::Object<JsonArray> New(jni::JNIEnv&, const std::vector<mapbox::geometry::value>&); + static std::vector<mapbox::geometry::value> convert(JNIEnv&, jni::Object<JsonArray>); static jni::Class<JsonArray> javaClass; diff --git a/platform/android/src/gson/json_element.cpp b/platform/android/src/gson/json_element.cpp index 060b1e0fe2..5eaaf531f4 100644 --- a/platform/android/src/gson/json_element.cpp +++ b/platform/android/src/gson/json_element.cpp @@ -11,6 +11,34 @@ namespace mbgl { namespace android { namespace gson { +/** + * Turn mapbox::geometry::value into Java Gson JsonElement + */ +class JsonElementEvaluator { +public: + + jni::JNIEnv& env; + + jni::Object<JsonElement> operator()(const JsonPrimitive::value value) const { + return jni::Cast(env, JsonPrimitive::New(env, value), JsonElement::javaClass); + } + + jni::Object<JsonElement> operator()(const std::vector<mapbox::geometry::value> &values) const { + return jni::Cast(env, JsonArray::New(env, values), JsonElement::javaClass); + } + + jni::Object<JsonElement> operator()(const std::unordered_map<std::string, mapbox::geometry::value> &values) const { + return jni::Cast(env, JsonObject::New(env, values), JsonElement::javaClass); + } + +}; + + +jni::Object<JsonElement> JsonElement::New(jni::JNIEnv& env, const mapbox::geometry::value& value) { + JsonElementEvaluator evaluator { env } ; + return mapbox::geometry::value::visit(value, evaluator); +} + mapbox::geometry::value JsonElement::convert(jni::JNIEnv &env, jni::Object<JsonElement> jsonElement) { mapbox::geometry::value value; diff --git a/platform/android/src/gson/json_element.hpp b/platform/android/src/gson/json_element.hpp index 7619350617..d850caa526 100644 --- a/platform/android/src/gson/json_element.hpp +++ b/platform/android/src/gson/json_element.hpp @@ -13,6 +13,8 @@ class JsonElement : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "com/google/gson/JsonElement"; }; + static jni::Object<JsonElement> New(jni::JNIEnv&, const mapbox::geometry::value&); + static mapbox::geometry::value convert(JNIEnv&, jni::Object<JsonElement>); static bool isJsonObject(JNIEnv&, jni::Object<JsonElement>); diff --git a/platform/android/src/gson/json_object.cpp b/platform/android/src/gson/json_object.cpp index a704dae9dd..61b55f8b9e 100644 --- a/platform/android/src/gson/json_object.cpp +++ b/platform/android/src/gson/json_object.cpp @@ -9,6 +9,23 @@ namespace android { namespace gson { +jni::Object<JsonObject> JsonObject::New(jni::JNIEnv& env, const std::unordered_map<std::string, mapbox::geometry::value>& values) { + static auto constructor = JsonObject::javaClass.GetConstructor(env); + static auto addMethod = JsonObject::javaClass.GetMethod<void (jni::String, jni::Object<JsonElement>)>(env, "add"); + + jni::Object<JsonObject> jsonObject = JsonObject::javaClass.New(env, constructor); + + for (auto &item : values) { + jni::Object<JsonElement> jsonElement = JsonElement::New(env, item.second); + jni::String key = jni::Make<jni::String>(env, item.first); + jsonObject.Call(env, addMethod, key, jsonElement); + jni::DeleteLocalRef(env, jsonElement); + jni::DeleteLocalRef(env, key); + } + + return jsonObject; +} + template <typename F> // void (jni::String, jni::Object<gson::JsonElement>) static void iterateEntrySet(jni::JNIEnv& env, jni::Object<JsonObject> jsonObject, F callback) { // Get Set<Map.Entry<String, JsonElement>> diff --git a/platform/android/src/gson/json_object.hpp b/platform/android/src/gson/json_object.hpp index aba8e40415..4bc61e51a2 100644 --- a/platform/android/src/gson/json_object.hpp +++ b/platform/android/src/gson/json_object.hpp @@ -13,6 +13,8 @@ class JsonObject : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "com/google/gson/JsonObject"; }; + static jni::Object<JsonObject> New(jni::JNIEnv&, const std::unordered_map<std::string, mapbox::geometry::value>&); + static mapbox::geometry::property_map convert(JNIEnv&, jni::Object<JsonObject>); static jni::Class<JsonObject> javaClass; diff --git a/platform/android/src/gson/json_primitive.cpp b/platform/android/src/gson/json_primitive.cpp index 58d0b45fe7..4e171c4845 100644 --- a/platform/android/src/gson/json_primitive.cpp +++ b/platform/android/src/gson/json_primitive.cpp @@ -1,9 +1,89 @@ #include "json_primitive.hpp" +#include "../java/lang.hpp" namespace mbgl { namespace android { namespace gson { +/** + * Turn mapbox::geometry::value into Java Gson JsonPrimitives + */ +class JsonPrimitiveEvaluator { +public: + + jni::JNIEnv& env; + + /** + * Create a null primitive + */ + jni::Object<JsonPrimitive> operator()(const mapbox::geometry::null_value_t) const { + return jni::Object<JsonPrimitive>(); + } + + /** + * Create a primitive containing a string value + */ + jni::Object<JsonPrimitive> operator()(const std::string value) const { + static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::String>(env); + auto jvalue = jni::Make<jni::String>(env, value); + auto jsonPrimitive = JsonPrimitive::javaClass.New(env, constructor, jvalue); + jni::DeleteLocalRef(env, jvalue); + return jsonPrimitive; + } + + /** + * Create a primitive containing a number value with type double + */ + jni::Object<JsonPrimitive> operator()(const double value) const { + static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::Object<java::lang::Number>>(env); + auto boxedValue = java::lang::Double::valueOf(env, value); + auto number = jni::Cast(env, boxedValue, java::lang::Number::javaClass); + auto jsonPrimitive = JsonPrimitive::javaClass.New(env, constructor, number); + jni::DeleteLocalRef(env, boxedValue); + return jsonPrimitive; + } + + /** + * Create a primitive containing a number value with type long + */ + jni::Object<JsonPrimitive> operator()(const int64_t value) const { + static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::Object<java::lang::Number>>(env); + auto boxedValue = java::lang::Long::valueOf(env, value); + auto number = jni::Cast(env, boxedValue, java::lang::Number::javaClass); + auto jsonPrimitive = JsonPrimitive::javaClass.New(env, constructor, number); + jni::DeleteLocalRef(env, boxedValue); + return jsonPrimitive; + } + + /** + * Create a primitive containing a number value with type long + */ + jni::Object<JsonPrimitive> operator()(const uint64_t value) const { + static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::Object<java::lang::Number>>(env); + auto boxedValue = java::lang::Long::valueOf(env, value); + auto number = jni::Cast(env, boxedValue, java::lang::Number::javaClass); + auto jsonPrimitive = JsonPrimitive::javaClass.New(env, constructor, number); + jni::DeleteLocalRef(env, boxedValue); + return jsonPrimitive; + } + + /** + * Create a primitive containing a boolean value + */ + jni::Object<JsonPrimitive> operator()(const bool value) const { + static auto constructor = JsonPrimitive::javaClass.GetConstructor<jni::Object<java::lang::Boolean>>(env); + auto boxedValue = java::lang::Boolean::valueOf(env, value); + auto jsonPrimitive = JsonPrimitive::javaClass.New(env, constructor, boxedValue); + jni::DeleteLocalRef(env, boxedValue); + return jsonPrimitive; + } +}; + +jni::Object<JsonPrimitive> JsonPrimitive::New(jni::JNIEnv &env, const value& value) { + JsonPrimitiveEvaluator evaluator { env }; + return value::visit(value, evaluator); +} + JsonPrimitive::value JsonPrimitive::convert(jni::JNIEnv &env, jni::Object<JsonPrimitive> jsonPrimitive) { value value; if (jsonPrimitive) { diff --git a/platform/android/src/gson/json_primitive.hpp b/platform/android/src/gson/json_primitive.hpp index 5fc8a2b485..c418e0ebe8 100644 --- a/platform/android/src/gson/json_primitive.hpp +++ b/platform/android/src/gson/json_primitive.hpp @@ -15,6 +15,8 @@ public: static constexpr auto Name() { return "com/google/gson/JsonPrimitive"; }; + static jni::Object<JsonPrimitive> New(jni::JNIEnv&, const value&); + static value convert(JNIEnv&, jni::Object<JsonPrimitive>); static bool isBoolean(JNIEnv&, jni::Object<JsonPrimitive>); |