Mercurial > repos > blastem
diff util.c @ 2682:143cb5762ec9
Fix generating shader list on Android
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 26 Mar 2025 22:30:22 -0700 |
parents | c4256ce2c45a |
children |
line wrap: on
line diff
--- a/util.c Wed Mar 26 01:20:55 2025 -0700 +++ b/util.c Wed Mar 26 22:30:22 2025 -0700 @@ -866,6 +866,43 @@ } #include <dirent.h> +#ifdef __ANDROID__ +static dir_entry *jdir_list_helper(JNIEnv *env, jmethodID meth, char *path, size_t *numret) +{ + jstring jpath = (*env)->NewStringUTF(env, path); + jobject activity = SDL_AndroidGetActivity(); + jobject ret = (*env)->CallObjectMethod(env, activity, meth, jpath); + dir_entry *res = NULL; + if (ret) { + jsize num = (*env)->GetArrayLength(env, ret); + if (numret) { + *numret = num; + } + res = calloc(num, sizeof(dir_entry)); + for (jsize i = 0; i < num; i++) + { + jstring entry = (*env)->GetObjectArrayElement(env, ret, i); + char const *tmp = (*env)->GetStringUTFChars(env, entry, NULL); + jsize len = (*env)->GetStringUTFLength(env, entry); + res[i].name = calloc(len + 1, 1); + res[i].is_dir = tmp[len-1] == '/'; + memcpy(res[i].name, tmp, res[i].is_dir ? len -1 : len); + (*env)->ReleaseStringUTFChars(env, entry, tmp); + } + (*env)->DeleteLocalRef(env, ret); + } + + (*env)->DeleteLocalRef(env, activity); + if (!res) { + if (numret) { + *numret = 0; + } + return NULL; + } + return res; +} +#endif + dir_entry *get_dir_list(char *path, size_t *numret) { #ifdef __ANDROID__ @@ -883,37 +920,7 @@ fatal_error("Failed to find method %s\n", read_uri_dir_name); } debug_message("get_dir_list(%s) using Storage Access Framework\n", path); - jstring jpath = (*env)->NewStringUTF(env, path); - jobject activity = SDL_AndroidGetActivity(); - jobject ret = (*env)->CallObjectMethod(env, activity, meth, jpath); - dir_entry *res = NULL; - if (ret) { - jsize num = (*env)->GetArrayLength(env, ret); - if (numret) { - *numret = num; - } - res = calloc(num, sizeof(dir_entry)); - for (jsize i = 0; i < num; i++) - { - jstring entry = (*env)->GetObjectArrayElement(env, ret, i); - char const *tmp = (*env)->GetStringUTFChars(env, entry, NULL); - jsize len = (*env)->GetStringUTFLength(env, entry); - res[i].name = calloc(len + 1, 1); - res[i].is_dir = tmp[len-1] == '/'; - memcpy(res[i].name, tmp, res[i].is_dir ? len -1 : len); - (*env)->ReleaseStringUTFChars(env, entry, tmp); - } - (*env)->DeleteLocalRef(env, ret); - } - - (*env)->DeleteLocalRef(env, activity); - if (!res) { - if (numret) { - *numret = 0; - } - return NULL; - } - return res; + return jdir_list_helper(env, meth, path, numret); } #endif DIR *d = opendir(path); @@ -1055,6 +1062,22 @@ return ret; } +dir_entry *get_bundled_dir_list(char *name, size_t *num_out) +{ + static const char activity_class_name[] = "com/retrodev/blastem/BlastEmActivity"; + static const char get_assets_list_name[] = "getAssetsList"; + JNIEnv *env = SDL_AndroidGetJNIEnv(); + jclass act_class = (*env)->FindClass(env, activity_class_name); + if (!act_class) { + fatal_error("Failed to find activity class %s\n", activity_class_name); + } + jmethodID meth = (*env)->GetMethodID(env, act_class, get_assets_list_name, "(Ljava/lang/String;)[Ljava/lang/String;"); + if (!meth) { + fatal_error("Failed to find method %s\n", get_assets_list_name); + } + return jdir_list_helper(env, meth, name, num_out); +} + static int open_uri(const char *path, const char *mode) { static const char activity_class_name[] = "com/retrodev/blastem/BlastEmActivity"; @@ -1173,6 +1196,14 @@ fclose(f); return ret; } + +dir_entry *get_bundled_dir_list(char *name, size_t *num_out) +{ + char *path = bundled_file_path(name); + dir_entry *ret = get_dir_list(path, num_out); + free(path); + return ret; +} #endif //ISLIB #ifdef _WIN32