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