[android] Fixed local ref leaks in jni.

This commit is contained in:
Dmitry Yunitsky 2016-03-15 11:28:46 +03:00 committed by Sergey Yershov
parent 5fbe60570b
commit d888fd65a2
2 changed files with 13 additions and 33 deletions

View file

@ -105,9 +105,8 @@ jobjectArray BuildJavaResults(Results const & results, bool hasPosition, double
jobjectArray const jResults = env->NewObjectArray(count, g_resultClass, 0);
for (int i = 0; i < count; i++)
{
jobject jRes = ToJavaResult(g_results.GetResult(i), hasPosition, lat, lon);
env->SetObjectArrayElement(jResults, i, jRes);
env->DeleteLocalRef(jRes);
jni::TScopedLocalRef jRes(env, ToJavaResult(g_results.GetResult(i), hasPosition, lat, lon));
env->SetObjectArrayElement(jResults, i, jRes.get());
}
return jResults;
}
@ -129,9 +128,8 @@ void OnResults(Results const & results, long long timestamp, bool isMapAndTable,
return;
}
jobjectArray const & jResults = BuildJavaResults(results, hasPosition, lat, lon);
env->CallVoidMethod(g_javaListener, g_updateResultsId, jResults, static_cast<jlong>(timestamp));
env->DeleteLocalRef(jResults);
jni::TScopedLocalObjectArrayRef jResults(env, BuildJavaResults(results, hasPosition, lat, lon));
env->CallVoidMethod(g_javaListener, g_updateResultsId, jResults.get(), static_cast<jlong>(timestamp));
}
} // namespace
@ -145,10 +143,10 @@ extern "C"
g_javaListener = env->NewGlobalRef(thiz);
g_updateResultsId = jni::GetMethodID(env, g_javaListener, "onResultsUpdate", "([Lcom/mapswithme/maps/search/SearchResult;J)V");
g_endResultsId = jni::GetMethodID(env, g_javaListener, "onResultsEnd", "(J)V");
g_resultClass = static_cast<jclass>(env->NewGlobalRef(env->FindClass("com/mapswithme/maps/search/SearchResult")));
g_resultClass = jni::GetGlobalClassRef(env, env->NewGlobalRef(env->FindClass("com/mapswithme/maps/search/SearchResult")));
g_resultConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Lcom/mapswithme/maps/search/SearchResult$Description;DD[I)V");
g_suggestConstructor = jni::GetConstructorID(env, g_resultClass, "(Ljava/lang/String;Ljava/lang/String;DD[I)V");
g_descriptionClass = static_cast<jclass>(env->NewGlobalRef(env->FindClass("com/mapswithme/maps/search/SearchResult$Description")));
g_descriptionClass = jni::GetGlobalClassRef(env, env->NewGlobalRef(env->FindClass("com/mapswithme/maps/search/SearchResult$Description")));
g_descriptionConstructor = jni::GetConstructorID(env, g_descriptionClass, "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V");
}

View file

@ -33,34 +33,16 @@ string GetAndroidSystemLanguage()
return DEFAULT_LANG;
}
jclass localeClass = env->FindClass("java/util/Locale");
ASSERT(localeClass, ());
jmethodID localeGetDefaultId = env->GetStaticMethodID(localeClass, "getDefault", "()Ljava/util/Locale;");
static jclass const localeClass = jni::GetGlobalClassRef(env, "java/util/Locale");
static jmethodID const localeGetDefaultId = env->GetStaticMethodID(localeClass, "getDefault", "()Ljava/util/Locale;");
ASSERT(localeGetDefaultId, ());
static jmethodID const localeToStringId = env->GetMethodID(localeClass, "toString", "()Ljava/lang/String;");
ASSERT(localeToStringId, ());
jobject localeInstance = env->CallStaticObjectMethod(localeClass, localeGetDefaultId);
ASSERT(localeInstance, ());
jni::TScopedLocalRef localeInstance(env, env->CallStaticObjectMethod(localeClass, localeGetDefaultId));
jni::TScopedLocalRef langString(env, env->CallObjectMethod(localeInstance.get(), localeToStringId));
jmethodID localeGetLanguageId = env->GetMethodID(localeClass, "toString", "()Ljava/lang/String;");
ASSERT(localeGetLanguageId, ());
jstring langString = (jstring)env->CallObjectMethod(localeInstance, localeGetLanguageId);
ASSERT(langString, ());
// TODO FindClass method won't work from non-ui threads, so cache class, remove comment or use cached classloader after it's implemented
/*
jclass langClass = env->FindClass("com/mapswithme/util/Language");
ASSERT(langClass, ());
jmethodID langGetDefaultId = env->GetStaticMethodID(langClass, "getDefault", "()Ljava/lang/String;");
ASSERT(langGetDefaultId, ());
jstring langString = (jstring)env->CallStaticObjectMethod(langClass, langGetDefaultId);
ASSERT(langString, ());
*/
string res = jni::ToNativeString(env, langString);
string res = jni::ToNativeString(env, (jstring) langString.get());
if (res.empty())
res = DEFAULT_LANG;