diff options
Diffstat (limited to 'platform/android/src/gson/json_object.cpp')
-rw-r--r-- | platform/android/src/gson/json_object.cpp | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/platform/android/src/gson/json_object.cpp b/platform/android/src/gson/json_object.cpp index 61b55f8b9e..4a2ec07563 100644 --- a/platform/android/src/gson/json_object.cpp +++ b/platform/android/src/gson/json_object.cpp @@ -10,17 +10,16 @@ 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"); + static auto javaClass = jni::Class<JsonObject>::Singleton(env); + static auto constructor = javaClass.GetConstructor(env); + static auto addMethod = javaClass.GetMethod<void (jni::String, jni::Object<JsonElement>)>(env, "add"); - jni::Object<JsonObject> jsonObject = JsonObject::javaClass.New(env, constructor); + jni::Object<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); + jsonObject.Call(env, addMethod, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, item.first)), + *jni::SeizeLocal(env, JsonElement::New(env, item.second))); } return jsonObject; @@ -29,32 +28,22 @@ jni::Object<JsonObject> JsonObject::New(jni::JNIEnv& env, const std::unordered_m 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>> - static auto method = JsonObject::javaClass.GetMethod<jni::Object<java::util::Set> ()>(env, "entrySet"); - auto entrySet = jsonObject.Call(env, method); - jni::Array<jni::Object<java::util::Map::Entry>> entryArray = java::util::Set::toArray<java::util::Map::Entry>(env, entrySet); + static auto javaClass = jni::Class<JsonObject>::Singleton(env); + static auto method = javaClass.GetMethod<jni::Object<java::util::Set> ()>(env, "entrySet"); - size_t size = entryArray.Length(env); + auto entryArray = + jni::SeizeLocal(env, java::util::Set::toArray<java::util::Map::Entry>(env, + *jni::SeizeLocal(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); + auto entry = jni::SeizeLocal(env, entryArray->Get(env, i)); if (entry) { - // Convert - auto jKey = java::util::Map::Entry::getKey<jni::ObjectTag>(env, entry); - auto jKeyString = jni::String(reinterpret_cast<jni::jstring*>(jKey.Get())); - auto jValue = java::util::Map::Entry::getValue<gson::JsonElement>(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); + callback( + *jni::SeizeLocal(env, java::util::Map::Entry::getKey<jni::StringTag>(env, *entry)), + *jni::SeizeLocal(env, java::util::Map::Entry::getValue<gson::JsonElement>(env, *entry))); } - jni::DeleteLocalRef(env, entry); } - - jni::DeleteLocalRef(env, entrySet); - jni::DeleteLocalRef(env, entryArray); } mapbox::geometry::property_map JsonObject::convert(jni::JNIEnv &env, jni::Object<JsonObject> jsonObject) { @@ -70,12 +59,9 @@ mapbox::geometry::property_map JsonObject::convert(jni::JNIEnv &env, jni::Object } void JsonObject::registerNative(jni::JNIEnv &env) { - // Lookup the class - javaClass = *jni::Class<JsonObject>::Find(env).NewGlobalRef(env).release(); + jni::Class<JsonObject>::Singleton(env); } -jni::Class<JsonObject> JsonObject::javaClass; - } // namespace gson } // namespace android } // namespace mbgl
\ No newline at end of file |