diff options
author | Arsentiy Milchakov <milcars@mapswithme.com> | 2017-05-10 17:42:57 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-10 17:42:57 +0300 |
commit | c196052ce879b1d1729040add04c1385276821ad (patch) | |
tree | b262f344d3646790c085a626d22e5c5b15359e3e | |
parent | bd4df1fbfca63e7c3a4a17801d3e411cdf1bd70d (diff) | |
parent | ecfeac34c09c12b19acba49d478ba3af00014abc (diff) |
Merge pull request #6025 from alexzatsepin/MAPSME-4457-local-refs-table-overflowbeta-798
[android] Fixed local references overflow in HttpClient while vieport…
-rw-r--r-- | android/jni/com/mapswithme/util/HttpClient.cpp | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/android/jni/com/mapswithme/util/HttpClient.cpp b/android/jni/com/mapswithme/util/HttpClient.cpp index 49e71dbff3..05870ac83b 100644 --- a/android/jni/com/mapswithme/util/HttpClient.cpp +++ b/android/jni/com/mapswithme/util/HttpClient.cpp @@ -105,14 +105,15 @@ void SetHeaders(ScopedEnv & env, jobject const params, RethrowOnJniException(env); using HeaderPair = unordered_map<string, string>::value_type; - env->CallVoidMethod( - params, setHeaders, - jni::ToJavaArray(env.get(), g_httpHeaderClazz, headers, [](JNIEnv * env, - HeaderPair const & item) { - return env->NewObject(g_httpHeaderClazz, headerInit, - jni::TScopedLocalRef(env, jni::ToJavaString(env, item.first)).get(), - jni::TScopedLocalRef(env, jni::ToJavaString(env, item.second)).get()); - })); + auto headerFunc = [](JNIEnv * env, HeaderPair const & item) + { + jni::TScopedLocalRef first(env, jni::ToJavaString(env, item.first)); + jni::TScopedLocalRef second(env, jni::ToJavaString(env, item.second)); + return env->NewObject(g_httpHeaderClazz, headerInit, first.get(), second.get()); + }; + jni::TScopedLocalObjectArrayRef jHeaders(env.get(), jni::ToJavaArray(env.get(), g_httpHeaderClazz, + headers, headerFunc)); + env->CallVoidMethod(params, setHeaders, jHeaders.get()); RethrowOnJniException(env); } @@ -243,17 +244,15 @@ bool HttpClient::RunHttpRequest() env->GetStaticMethodID(g_httpClientClazz, "run", "(Lcom/mapswithme/util/HttpClient$Params;)Lcom/mapswithme/util/HttpClient$Params;"); - // Current Java implementation simply reuses input params instance, so we don't need to - // call DeleteLocalRef(response). - jobject const response = - env->CallStaticObjectMethod(g_httpClientClazz, httpClientClassRun, httpParamsObject.get()); + jni::ScopedLocalRef<jobject> const response(env.get(), env->CallStaticObjectMethod(g_httpClientClazz, + httpClientClassRun, httpParamsObject.get())); if (jni::HandleJavaException(env.get())) return false; try { - GetInt(env, response, ids.GetId("httpResponseCode"), m_errorCode); - GetString(env, response, ids.GetId("receivedUrl"), m_urlReceived); + GetInt(env, response.get(), ids.GetId("httpResponseCode"), m_errorCode); + GetString(env, response.get(), ids.GetId("receivedUrl"), m_urlReceived); ::LoadHeaders(env, httpParamsObject.get(), m_headers); } catch (JniException const & ex) |