|
37 | 37 | #include <CoreFoundation/CoreFoundation.h>
|
38 | 38 | #endif
|
39 | 39 |
|
| 40 | +#ifdef HOST_ANDROID |
| 41 | +#include <android/log.h> |
| 42 | +#include <jni.h> |
| 43 | +#endif |
| 44 | + |
40 | 45 | #undef DEBUG
|
41 | 46 |
|
42 | 47 | static gint32 string_invariant_compare_char (gunichar2 c1, gunichar2 c2,
|
@@ -522,6 +527,69 @@ get_darwin_locale (void)
|
522 | 527 | }
|
523 | 528 | #endif
|
524 | 529 |
|
| 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 | + |
525 | 593 | static char *
|
526 | 594 | get_posix_locale (void)
|
527 | 595 | {
|
@@ -561,6 +629,11 @@ get_current_locale_name (void)
|
561 | 629 | locale = get_darwin_locale ();
|
562 | 630 | if (!locale)
|
563 | 631 | 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(); |
564 | 637 | #else
|
565 | 638 | locale = get_posix_locale ();
|
566 | 639 | #endif
|
|
0 commit comments