forked from organicmaps/organicmaps
[android] Fixed local ref leaks in jni.
This commit is contained in:
parent
5fbe60570b
commit
d888fd65a2
2 changed files with 13 additions and 33 deletions
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue