summaryrefslogtreecommitdiff
path: root/platform/android/src/gson/json_object.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/gson/json_object.cpp')
-rw-r--r--platform/android/src/gson/json_object.cpp52
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