|
@@ -356,6 +356,12 @@ static SDL_bool bHasEnvironmentVariables; |
|
|
static SDL_atomic_t bPermissionRequestPending; |
|
|
static SDL_bool bPermissionRequestResult; |
|
|
|
|
|
/* Android AssetManager */ |
|
|
static void Internal_Android_Create_AssetManager(void); |
|
|
static void Internal_Android_Destroy_AssetManager(void); |
|
|
static AAssetManager *asset_manager = NULL; |
|
|
static jobject javaAssetManagerRef = 0; |
|
|
|
|
|
/******************************************************************************* |
|
|
Functions called by JNI |
|
|
*******************************************************************************/ |
|
@@ -1177,6 +1183,8 @@ JNIEXPORT void JNICALL SDL_JAVA_INTERFACE(nativeQuit)( |
|
|
Android_ResumeSem = NULL; |
|
|
} |
|
|
|
|
|
Internal_Android_Destroy_AssetManager(); |
|
|
|
|
|
str = SDL_GetError(); |
|
|
if (str && str[0]) { |
|
|
__android_log_print(ANDROID_LOG_ERROR, "SDL", "SDLActivity thread ends (error=%s)", str); |
|
@@ -1799,6 +1807,53 @@ static SDL_bool Android_JNI_ExceptionOccurred(SDL_bool silent) |
|
|
return SDL_FALSE; |
|
|
} |
|
|
|
|
|
static void Internal_Android_Create_AssetManager() { |
|
|
|
|
|
struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__); |
|
|
JNIEnv *env = Android_JNI_GetEnv(); |
|
|
jmethodID mid; |
|
|
jobject context; |
|
|
jobject javaAssetManager; |
|
|
|
|
|
if (!LocalReferenceHolder_Init(&refs, env)) { |
|
|
LocalReferenceHolder_Cleanup(&refs); |
|
|
return; |
|
|
} |
|
|
|
|
|
/* context = SDLActivity.getContext(); */ |
|
|
context = (*env)->CallStaticObjectMethod(env, mActivityClass, midGetContext); |
|
|
|
|
|
/* javaAssetManager = context.getAssets(); */ |
|
|
mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), |
|
|
"getAssets", "()Landroid/content/res/AssetManager;"); |
|
|
javaAssetManager = (*env)->CallObjectMethod(env, context, mid); |
|
|
|
|
|
/** |
|
|
* Given a Dalvik AssetManager object, obtain the corresponding native AAssetManager |
|
|
* object. Note that the caller is responsible for obtaining and holding a VM reference |
|
|
* to the jobject to prevent its being garbage collected while the native object is |
|
|
* in use. |
|
|
*/ |
|
|
javaAssetManagerRef = (*env)->NewGlobalRef(env, javaAssetManager); |
|
|
asset_manager = AAssetManager_fromJava(env, javaAssetManagerRef); |
|
|
|
|
|
if (asset_manager == NULL) { |
|
|
(*env)->DeleteGlobalRef(env, javaAssetManagerRef); |
|
|
Android_JNI_ExceptionOccurred(SDL_TRUE); |
|
|
} |
|
|
|
|
|
LocalReferenceHolder_Cleanup(&refs); |
|
|
} |
|
|
|
|
|
static void Internal_Android_Destroy_AssetManager() { |
|
|
JNIEnv *env = Android_JNI_GetEnv(); |
|
|
|
|
|
if (asset_manager) { |
|
|
(*env)->DeleteGlobalRef(env, javaAssetManagerRef); |
|
|
asset_manager = NULL; |
|
|
} |
|
|
} |
|
|
|
|
|
static int Internal_Android_JNI_FileOpen(SDL_RWops *ctx) |
|
|
{ |
|
|
struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__); |
|
@@ -2800,50 +2855,32 @@ SDL_bool Android_JNI_RequestPermission(const char *permission) |
|
|
|
|
|
int Android_JNI_GetLocale(char *buf, size_t buflen) |
|
|
{ |
|
|
struct LocalReferenceHolder refs = LocalReferenceHolder_Setup(__FUNCTION__); |
|
|
JNIEnv* env = Android_JNI_GetEnv(); |
|
|
int retval = -1; |
|
|
|
|
|
JNIEnv *mEnv = Android_JNI_GetEnv(); |
|
|
if (!LocalReferenceHolder_Init(&refs, env)) { |
|
|
LocalReferenceHolder_Cleanup(&refs); |
|
|
return -1; |
|
|
} |
|
|
AConfiguration *cfg; |
|
|
|
|
|
SDL_assert(buflen > 6); |
|
|
|
|
|
jmethodID mid; |
|
|
jobject context; |
|
|
jobject assetManager; |
|
|
|
|
|
/* context = SDLActivity.getContext(); */ |
|
|
mid = (*mEnv)->GetStaticMethodID(mEnv, mActivityClass, |
|
|
"getContext","()Landroid/content/Context;"); |
|
|
context = (*mEnv)->CallStaticObjectMethod(mEnv, mActivityClass, mid); |
|
|
|
|
|
/* assetManager = context.getAssets(); */ |
|
|
mid = (*mEnv)->GetMethodID(mEnv, (*mEnv)->GetObjectClass(mEnv, context), |
|
|
"getAssets", "()Landroid/content/res/AssetManager;"); |
|
|
assetManager = (*mEnv)->CallObjectMethod(mEnv, context, mid); |
|
|
if (asset_manager == NULL) { |
|
|
Internal_Android_Create_AssetManager(); |
|
|
} |
|
|
|
|
|
if (asset_manager == NULL) { |
|
|
return -1; |
|
|
} |
|
|
|
|
|
/* API from NDK: android/configuration.h */ |
|
|
/* API from NDK: android/asset_manager_jni.h */ |
|
|
AAssetManager* asset_mgr = AAssetManager_fromJava(env, assetManager); |
|
|
AConfiguration *cfg = AConfiguration_new(); |
|
|
cfg = AConfiguration_new(); |
|
|
if (cfg == NULL) { |
|
|
return -1; |
|
|
} |
|
|
|
|
|
if (asset_mgr && cfg) |
|
|
{ |
|
|
char language[2] = {}; |
|
|
char country[2] = {}; |
|
|
size_t id = 0; |
|
|
|
|
|
AConfiguration_fromAssetManager(cfg, asset_mgr); |
|
|
AConfiguration_fromAssetManager(cfg, asset_manager); |
|
|
AConfiguration_getLanguage(cfg, language); |
|
|
AConfiguration_getCountry(cfg, country); |
|
|
|
|
|
retval = 0; |
|
|
|
|
|
/* copy language (not null terminated) */ |
|
|
if (language[0]) { |
|
|
buf[id++] = language[0]; |
|
@@ -2866,12 +2903,9 @@ int Android_JNI_GetLocale(char *buf, size_t buflen) |
|
|
SDL_assert(id <= buflen); |
|
|
} |
|
|
|
|
|
if (cfg) { |
|
|
AConfiguration_delete(cfg); |
|
|
} |
|
|
AConfiguration_delete(cfg); |
|
|
|
|
|
LocalReferenceHolder_Cleanup(&refs); |
|
|
return retval; |
|
|
return 0; |
|
|
} |
|
|
|
|
|
#endif /* __ANDROID__ */ |
|
|