AssetManager: convert missed Java_android_content_res_AssetManager_list to use libandroidfw

It was broken since the conversion because we no longer extract assets.
This commit is contained in:
Mis012
2025-08-06 21:04:53 +02:00
parent ebd16f01dc
commit d52985a6df

View File

@@ -39,9 +39,6 @@ void _AssetManager_unlock(struct AssetManager ** asset_manager)
AssetManager_lock(asset_manager); \ AssetManager_lock(asset_manager); \
__attribute__((__cleanup__(_AssetManager_unlock))) struct AssetManager *_RESERVED_am = asset_manager; __attribute__((__cleanup__(_AssetManager_unlock))) struct AssetManager *_RESERVED_am = asset_manager;
#define ASSET_DIR "assets/"
char *get_app_data_dir();
JNIEXPORT jlong JNICALL Java_android_content_res_AssetManager_openAsset(JNIEnv *env, jobject this, jstring _file_name, jint mode) JNIEXPORT jlong JNICALL Java_android_content_res_AssetManager_openAsset(JNIEnv *env, jobject this, jstring _file_name, jint mode)
{ {
const char *file_name = _CSTRING(_file_name); const char *file_name = _CSTRING(_file_name);
@@ -601,43 +598,37 @@ JNIEXPORT void JNICALL Java_android_content_res_AssetManager_setConfiguration(
AssetManager_setConfiguration(asset_manager, &config); AssetManager_setConfiguration(asset_manager, &config);
} }
JNIEXPORT jobjectArray JNICALL Java_android_content_res_AssetManager_list(JNIEnv *env, jobject this, jstring _path) JNIEXPORT jobjectArray JNICALL Java_android_content_res_AssetManager_list(JNIEnv *env, jobject this, jstring path_jstr)
{ {
DIR *d; const char *path = "";
struct dirent *dir;
const char* path_rel = _CSTRING(_path); path = (*env)->GetStringUTFChars(env, path_jstr, NULL);
char *app_data_dir = get_app_data_dir(); if (!path_jstr)
char *path_abs = malloc(strlen(app_data_dir) + strlen(ASSET_DIR) + strlen(path_rel) + 1); return NULL;
strcpy(path_abs, app_data_dir); struct AssetManager *asset_manager = _PTR(_GET_LONG_FIELD(this, "mObject"));
strcat(path_abs, ASSET_DIR); AM_SCOPEDLOCK(asset_manager)
strcat(path_abs, path_rel);
d = opendir(path_abs); struct AssetDir *asset_dir = AssetManager_openDir(asset_manager, path);
(*env)->ReleaseStringUTFChars(env, path_jstr, path);
GArray *assets = g_array_new(false, false, sizeof(const char *)); if (!asset_dir) {
int i = 0; (*env)->ThrowNew(env, (*env)->FindClass(env, "java/io/FileNotFoundException"), path);
if (d) return NULL;
{
while ((dir = readdir(d)) != NULL)
{
char *asset_path = malloc (strlen(dir->d_name) + 1);
strcpy(asset_path, dir->d_name);
g_array_append_val (assets, asset_path);
}
closedir(d);
} }
jobjectArray array = (*env)->NewObjectArray(env, assets->len, (*env)->FindClass(env, "java/lang/String"), NULL); const size_t file_count = AssetDir_getFileCount(asset_dir);
for (i = 0; i < assets->len; i++)
{ jobjectArray array = (*env)->NewObjectArray(env, file_count, (*env)->FindClass(env, "java/lang/String"), NULL);
const char *asset = g_array_index(assets, const char *, i); if (!array)
return NULL;
for (size_t i = 0; i < file_count; i++) {
const char *asset = AssetDir_getFileName(asset_dir, i);
jstring asset_jstr = (*env)->NewStringUTF(env, asset);
(*env)->SetObjectArrayElement(env, array, i, (*env)->NewStringUTF(env, asset)); (*env)->SetObjectArrayElement(env, array, i, (*env)->NewStringUTF(env, asset));
(*env)->DeleteLocalRef(env, asset_jstr);
} }
g_array_free(assets, TRUE);
return array; return array;
} }