#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 std::unordered_map& values) { static auto constructor = JsonObject::javaClass.GetConstructor(env); static auto addMethod = JsonObject::javaClass.GetMethod)>(env, "add"); jni::Object jsonObject = JsonObject::javaClass.New(env, constructor); for (auto &item : values) { jni::Object jsonElement = JsonElement::New(env, item.second); jni::String key = jni::Make(env, item.first); jsonObject.Call(env, addMethod, key, jsonElement); jni::DeleteLocalRef(env, jsonElement); jni::DeleteLocalRef(env, key); } return jsonObject; } template // void (jni::String, jni::Object) static void iterateEntrySet(jni::JNIEnv& env, jni::Object jsonObject, F callback) { // Get Set> static auto method = JsonObject::javaClass.GetMethod ()>(env, "entrySet"); auto entrySet = jsonObject.Call(env, method); jni::Array> entryArray = java::util::Set::toArray(env, entrySet); size_t size = entryArray.Length(env); for (size_t i = 0; i < size; i++) { auto entry = entryArray.Get(env, i); if (entry) { // Convert auto jKey = java::util::Map::Entry::getKey(env, entry); auto jKeyString = jni::String(reinterpret_cast(jKey.Get())); auto jValue = java::util::Map::Entry::getValue(env, entry); // Callback callback(jKeyString, jValue); // Cleanup // Skip jKey as it points to the same as jKeyString jni::DeleteLocalRef(env, jKeyString); jni::DeleteLocalRef(env, jValue); } jni::DeleteLocalRef(env, entry); } jni::DeleteLocalRef(env, entrySet); jni::DeleteLocalRef(env, entryArray); } mapbox::geometry::property_map JsonObject::convert(jni::JNIEnv &env, jni::Object jsonObject) { mapbox::geometry::property_map 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) { // Lookup the class javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); } jni::Class JsonObject::javaClass; } // namespace gson } // namespace android } // namespace mbgl