diff --git a/android/jni/com/mapswithme/maps/SearchEngine.cpp b/android/jni/com/mapswithme/maps/SearchEngine.cpp index b66cfb85dc..58ce860ccc 100644 --- a/android/jni/com/mapswithme/maps/SearchEngine.cpp +++ b/android/jni/com/mapswithme/maps/SearchEngine.cpp @@ -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(timestamp)); - env->DeleteLocalRef(jResults); + jni::TScopedLocalObjectArrayRef jResults(env, BuildJavaResults(results, hasPosition, lat, lon)); + env->CallVoidMethod(g_javaListener, g_updateResultsId, jResults.get(), static_cast(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(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(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"); } diff --git a/android/jni/com/mapswithme/platform/Language.cpp b/android/jni/com/mapswithme/platform/Language.cpp index b332ae2846..8069ca1aae 100644 --- a/android/jni/com/mapswithme/platform/Language.cpp +++ b/android/jni/com/mapswithme/platform/Language.cpp @@ -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;