Skip to content

Commit

Permalink
【Android】Get User Locale through JNI
Browse files Browse the repository at this point in the history
  • Loading branch information
skylersaleh committed Aug 3, 2023
1 parent 3267ff5 commit 9ae3065
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 3 deletions.
16 changes: 14 additions & 2 deletions src/localization.c
Original file line number Diff line number Diff line change
Expand Up @@ -1774,6 +1774,9 @@ const char* se_language_string(int language_enum){
}
return "";
}
#ifdef PLATFORM_ANDROID
extern void se_android_get_language(char* language_buffer, size_t buffer_size);
#endif
int se_get_default_language(){
static int default_lang = SE_LANG_DEFAULT;
if(default_lang==SE_LANG_DEFAULT){
Expand All @@ -1783,11 +1786,20 @@ int se_get_default_language(){
char lang_buffer[128];
CFArrayRef langs = CFLocaleCopyPreferredLanguages();
CFStringRef lang_code = CFArrayGetValueAtIndex(langs, 0);
CFStringGetCString(lang_code, lang_buffer, 128, kCFStringEncodingUTF8);
CFStringGetCString(lang_code, lang_buffer, 128, kCFStringEncodingUTF8);
default_lang = se_convert_locale_to_enum(lang_buffer);
if(default_lang != SE_LANG_DEFAULT) printf("Detected CF locale language: %s (enum: %s)\n", lang_buffer ,se_language_string(default_lang));
}
#endif
#endif
#ifdef PLATFORM_ANDROID
// Try to get from JNI
if(default_lang == SE_LANG_DEFAULT){
char lang_buffer[128];
se_android_get_language(lang_buffer,sizeof(lang_buffer));
default_lang = se_convert_locale_to_enum(lang_buffer);
if(default_lang != SE_LANG_DEFAULT) printf("Detected language from JNI: %s (enum: %s)\n", lang_buffer ,se_language_string(default_lang));
}
#endif
// Try to get from environment
if(default_lang == SE_LANG_DEFAULT){
char* clocale = getenv("LANG");
Expand Down
33 changes: 33 additions & 0 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2856,6 +2856,15 @@ bool se_selectable_with_box(const char * first_label, const char* second_label,
return clicked;
}
#ifdef PLATFORM_ANDROID
#include <android/log.h>

#define TAG "SkyEmu"

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)

void se_android_open_file_picker(){
ANativeActivity* activity =(ANativeActivity*)sapp_android_get_native_activity();
// Attaches the current thread to the JVM.
Expand Down Expand Up @@ -2895,6 +2904,30 @@ void se_android_get_visible_rect(float * top, float * bottom){
(*pJavaVM)->DetachCurrentThread(pJavaVM);
}
}
void se_android_get_language(char* language_buffer, size_t buffer_size){

ANativeActivity* activity =(ANativeActivity*)sapp_android_get_native_activity();
// Attaches the current thread to the JVM.
JavaVM *pJavaVM = activity->vm;
JNIEnv *pJNIEnv = activity->env;

jint nResult = (*pJavaVM)->AttachCurrentThread(pJavaVM, &pJNIEnv, NULL );
if ( nResult != JNI_ERR ){
// Retrieves NativeActivity.
jobject nativeActivity = activity->clazz;
jclass ClassNativeActivity = (*pJNIEnv)->GetObjectClass(pJNIEnv, nativeActivity );
jmethodID getLanguageMethod= (*pJNIEnv)->GetMethodID(pJNIEnv, ClassNativeActivity, "getLanguage", "()Ljava/lang/String;" );
if(getLanguageMethod) {
jstring joStringPropVal = (jstring) (*pJNIEnv)->CallStaticObjectMethod(pJNIEnv,ClassNativeActivity,getLanguageMethod);
const jchar *jcVal = (*pJNIEnv)->GetStringUTFChars(pJNIEnv, joStringPropVal, JNI_FALSE);
LOGD("Android Language is %s", jcVal);
strncpy(language_buffer, jcVal, buffer_size);
(*pJNIEnv)->ReleaseStringChars(pJNIEnv, joStringPropVal, jcVal);
}else LOGE("Failed to find getLanguage() method in JNIEnv");
// Finished with the JVM.
(*pJavaVM)->DetachCurrentThread(pJavaVM);
}
}
void se_android_set_keyboard_visible(bool visible){
static bool last_visible = false;
if(visible!=last_visible){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import android.widget.FrameLayout;

import java.io.File;
import java.util.Locale;
import java.util.Vector;

public class EnhancedNativeActivity extends NativeActivity {
Expand All @@ -41,7 +42,9 @@ public void requestPermissions() {
startActivityForResult(intent, APP_STORAGE_ACCESS_REQUEST_CODE);
}
}

}
public String getLanguage() {
return Locale.getDefault().toString();
}
/*Handle permission request results*/
@Override
Expand Down

0 comments on commit 9ae3065

Please sign in to comment.