#include "json_array.hpp" #include "json_element.hpp" namespace mbgl { namespace android { namespace gson { jni::Object JsonArray::New(jni::JNIEnv& env, const std::vector& values){ static auto constructor = JsonArray::javaClass.GetConstructor(env); static auto addMethod = JsonArray::javaClass.GetMethod)>(env, "add"); auto jsonArray = JsonArray::javaClass.New(env, constructor); for (const auto &v : values) { auto jsonElement = JsonElement::New(env, v); jsonArray.Call(env, addMethod, jsonElement); jni::DeleteLocalRef(env, jsonElement); } return jsonArray; } std::vector JsonArray::convert(jni::JNIEnv& env, const jni::Object jsonArray) { std::vector values; if (jsonArray) { static auto getMethod = JsonArray::javaClass.GetMethod (jni::jint)>(env, "get"); static auto sizeMethod = JsonArray::javaClass.GetMethod(env, "size"); int size = jsonArray.Call(env, sizeMethod); values.reserve(uint(size)); for (int i = 0; i < size; i++) { auto entry = jsonArray.Call(env, getMethod, i); if (entry) { values.push_back(JsonElement::convert(env, entry)); } jni::DeleteLocalRef(env, entry); } } return values; } void JsonArray::registerNative(jni::JNIEnv& env) { // Lookup the class javaClass = *jni::Class::Find(env).NewGlobalRef(env).release(); } jni::Class JsonArray::javaClass; } // namespace gson } // namespace android } // namespace mbgl