#include "json_object.hpp" #include "json_element.hpp" #include "../java/util.hpp" namespace mbgl { namespace android { namespace gson { jni::Local> JsonObject::New(jni::JNIEnv& env, const mbgl::PropertyMap& values) { static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); static auto addMethod = javaClass.GetMethod)>(env, "add"); auto jsonObject = javaClass.New(env, constructor); for (auto &item : values) { jsonObject.Call(env, addMethod, jni::Make(env, item.first), JsonElement::New(env, item.second)); } return jsonObject; } template // void (jni::String, jni::Object) static void iterateEntrySet(jni::JNIEnv& env, const jni::Object& jsonObject, F callback) { // Get Set> static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "entrySet"); auto entryArray = java::util::Set::toArray(env, jsonObject.Call(env, method)); size_t size = entryArray.Length(env); for (size_t i = 0; i < size; i++) { auto entry = entryArray.Get(env, i); if (entry) { callback( java::util::Map::Entry::getKey(env, entry), java::util::Map::Entry::getValue(env, entry)); } } } mbgl::PropertyMap JsonObject::convert(jni::JNIEnv& env, const jni::Object& jsonObject) { mbgl::PropertyMap map; if (jsonObject) { iterateEntrySet(env, jsonObject, [&map, &env](const jni::String& jId, const jni::Object& jsonElement) { map[jni::Make(env, jId)] = JsonElement::convert(env, jsonElement); }); } return map; } void JsonObject::registerNative(jni::JNIEnv &env) { jni::Class::Singleton(env); } } // namespace gson } // namespace android } // namespace mbgl