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.cpp56
1 files changed, 20 insertions, 36 deletions
diff --git a/platform/android/src/gson/json_object.cpp b/platform/android/src/gson/json_object.cpp
index 61b55f8b9e..10d244ee48 100644
--- a/platform/android/src/gson/json_object.cpp
+++ b/platform/android/src/gson/json_object.cpp
@@ -9,59 +9,46 @@ namespace android {
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");
+jni::Local<jni::Object<JsonObject>> JsonObject::New(jni::JNIEnv& env, const mbgl::PropertyMap& values) {
+ 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);
+ auto 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::Make<jni::String>(env, item.first),
+ JsonElement::New(env, item.second));
}
return jsonObject;
}
template <typename F> // void (jni::String, jni::Object<gson::JsonElement>)
-static void iterateEntrySet(jni::JNIEnv& env, jni::Object<JsonObject> jsonObject, F callback) {
+static void iterateEntrySet(jni::JNIEnv& env, const 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");
+
+ auto entryArray = java::util::Set::toArray<java::util::Map::Entry>(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) {
- // 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(
+ java::util::Map::Entry::getKey<jni::StringTag>(env, entry),
+ 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) {
- mapbox::geometry::property_map map;
+mbgl::PropertyMap JsonObject::convert(jni::JNIEnv& env, const jni::Object<JsonObject>& jsonObject) {
+ mbgl::PropertyMap map;
if (jsonObject) {
- iterateEntrySet(env, jsonObject, [&map, &env](jni::String jId, jni::Object<gson::JsonElement> jsonElement) {
+ iterateEntrySet(env, jsonObject, [&map, &env](const jni::String& jId, const jni::Object<gson::JsonElement>& jsonElement) {
map[jni::Make<std::string>(env, jId)] = JsonElement::convert(env, jsonElement);
});
}
@@ -70,12 +57,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