Skip to content

Commit 2370e8a

Browse files
authored
Merge pull request #1216 from Unity-Technologies/android-locale
[Android] Getting current locale using JNI
2 parents 3af2b9f + 63f6bbe commit 2370e8a

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

mono/metadata/locales.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@
3737
#include <CoreFoundation/CoreFoundation.h>
3838
#endif
3939

40+
#ifdef HOST_ANDROID
41+
#include <android/log.h>
42+
#include <jni.h>
43+
#endif
44+
4045
#undef DEBUG
4146

4247
static gint32 string_invariant_compare_char (gunichar2 c1, gunichar2 c2,
@@ -522,6 +527,69 @@ get_darwin_locale (void)
522527
}
523528
#endif
524529

530+
#ifdef HOST_ANDROID
531+
static JavaVM *sJavaVM = NULL;
532+
533+
JNIEXPORT jint JNI_OnLoad(JavaVM *jvm, void *reserved)
534+
{
535+
__android_log_print(ANDROID_LOG_INFO, "Mono", "JNI_OnLoad called");
536+
sJavaVM = jvm;
537+
return JNI_VERSION_1_6;
538+
}
539+
540+
JNIEXPORT void JNI_OnUnload(JavaVM *jvm, void *reserved)
541+
{
542+
__android_log_print(ANDROID_LOG_INFO, "Mono", "JNI_OnUnload called");
543+
sJavaVM = NULL;
544+
}
545+
546+
static gchar*
547+
get_android_locale (void)
548+
{
549+
static gchar *cached_locale = NULL;
550+
JNIEnv* env = NULL;
551+
jint detached;
552+
jclass localeClass;
553+
554+
if (cached_locale != NULL)
555+
return g_strdup (cached_locale);
556+
557+
if (sJavaVM == NULL)
558+
{
559+
__android_log_print(ANDROID_LOG_INFO, "Mono", "Java VM not initialized");
560+
return NULL;
561+
}
562+
detached = (*sJavaVM)->GetEnv(sJavaVM, (void**)&env, JNI_VERSION_1_2) == JNI_EDETACHED;
563+
if (detached)
564+
{
565+
(*sJavaVM)->AttachCurrentThread(sJavaVM, &env, NULL);
566+
}
567+
568+
localeClass = (*env)->FindClass(env, "java/util/Locale");
569+
if (localeClass != NULL) {
570+
jmethodID getDefault = (*env)->GetStaticMethodID(env, localeClass, "getDefault", "()Ljava/util/Locale;");
571+
if (getDefault != NULL) {
572+
jmethodID toLanguageTag;
573+
jstring tag;
574+
const char *nativeTag;
575+
jobject def = (*env)->CallStaticObjectMethod(env, localeClass, getDefault);
576+
toLanguageTag = (*env)->GetMethodID(env, localeClass, "toLanguageTag", "()Ljava/lang/String;");
577+
tag = (jstring)(*env)->CallObjectMethod(env, def, toLanguageTag);
578+
nativeTag = (*env)->GetStringUTFChars(env, tag, NULL);
579+
__android_log_print(ANDROID_LOG_INFO, "Mono", "Locale %s", nativeTag);
580+
cached_locale = g_strdup (nativeTag);
581+
(*env)->ReleaseStringUTFChars(env, tag, nativeTag);
582+
}
583+
}
584+
585+
if (detached)
586+
(*sJavaVM)->DetachCurrentThread(sJavaVM);
587+
588+
mono_memory_barrier ();
589+
return cached_locale ? g_strdup (cached_locale) : NULL;
590+
}
591+
#endif
592+
525593
static char *
526594
get_posix_locale (void)
527595
{
@@ -561,6 +629,11 @@ get_current_locale_name (void)
561629
locale = get_darwin_locale ();
562630
if (!locale)
563631
locale = get_posix_locale ();
632+
#elif defined HOST_ANDROID
633+
__android_log_print(ANDROID_LOG_INFO, "MONO", "Getting locale");
634+
locale = get_android_locale();
635+
if (!locale)
636+
locale = get_posix_locale();
564637
#else
565638
locale = get_posix_locale ();
566639
#endif

0 commit comments

Comments
 (0)