diff options
Diffstat (limited to 'luni/src/main/native/ICU.cpp')
-rw-r--r-- | luni/src/main/native/ICU.cpp | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/luni/src/main/native/ICU.cpp b/luni/src/main/native/ICU.cpp index 04f6631..7e05978 100644 --- a/luni/src/main/native/ICU.cpp +++ b/luni/src/main/native/ICU.cpp @@ -353,21 +353,6 @@ static jobjectArray getNames(JNIEnv* env, UResourceBundle* namesBundle, bool mon return result; } -static jstring getIntCurrencyCode(JNIEnv* env, jstring locale) { - ScopedUtfChars localeChars(env, locale); - - // Extract the 2-character country name. - if (strlen(localeChars.c_str()) < 5) { - return NULL; - } - if (localeChars[3] < 'A' || localeChars[3] > 'Z' || localeChars[4] < 'A' || localeChars[4] > 'Z') { - return NULL; - } - - char country[3] = { localeChars[3], localeChars[4], 0 }; - return ICU_getCurrencyCodeNative(env, NULL, env->NewStringUTF(country)); -} - static void setIntegerField(JNIEnv* env, jobject obj, const char* fieldName, int value) { ScopedLocalRef<jobject> integerValue(env, integerValueOf(env, value)); jfieldID fid = env->GetFieldID(JniConstants::localeDataClass, fieldName, "Ljava/lang/Integer;"); @@ -506,7 +491,8 @@ static jboolean ICU_initLocaleDataImpl(JNIEnv* env, jclass, jstring locale, jobj } status = U_ZERO_ERROR; - jstring internationalCurrencySymbol = getIntCurrencyCode(env, locale); + jstring countryCode = env->NewStringUTF(Locale::createFromName(localeName.c_str()).getCountry()); + jstring internationalCurrencySymbol = ICU_getCurrencyCodeNative(env, NULL, countryCode); jstring currencySymbol = NULL; if (internationalCurrencySymbol != NULL) { currencySymbol = ICU_getCurrencySymbolNative(env, NULL, locale, internationalCurrencySymbol); @@ -563,10 +549,19 @@ static JNINativeMethod gMethods[] = { NATIVE_METHOD(ICU, getISO3LanguageNative, "(Ljava/lang/String;)Ljava/lang/String;"), NATIVE_METHOD(ICU, getISOCountriesNative, "()[Ljava/lang/String;"), NATIVE_METHOD(ICU, getISOLanguagesNative, "()[Ljava/lang/String;"), - NATIVE_METHOD(ICU, initLocaleDataImpl, "(Ljava/lang/String;Lcom/ibm/icu4jni/util/LocaleData;)Z"), + NATIVE_METHOD(ICU, initLocaleDataImpl, "(Ljava/lang/String;Llibcore/icu/LocaleData;)Z"), NATIVE_METHOD(ICU, toLowerCase, "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"), NATIVE_METHOD(ICU, toUpperCase, "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"), }; -int register_com_ibm_icu4jni_util_ICU(JNIEnv* env) { - return jniRegisterNativeMethods(env, "com/ibm/icu4jni/util/ICU", gMethods, NELEM(gMethods)); +int register_libcore_icu_ICU(JNIEnv* env) { + // Failures to find the ICU data tend to be somewhat obscure because ICU loads its data on first + // use, which can be anywhere. Force initialization up front so we can report a nice clear error + // and bail. + UErrorCode status = U_ZERO_ERROR; + u_init(&status); + if (status != U_ZERO_ERROR) { + LOGE("Couldn't initialize ICU: %s", u_errorName(status)); + return -1; + } + return jniRegisterNativeMethods(env, "libcore/icu/ICU", gMethods, NELEM(gMethods)); } |