fix(android): fix compilation errors in dump functions

Use VFS API for directory creation and Java Long.valueOf() for
progress callbacks. Fix variable shadowing and add JNI reference cleanup.

Signed-off-by: Zephyron <zephyron@citron-emu.org>
This commit is contained in:
Zephyron
2025-11-29 12:20:38 +10:00
parent 9c250aabda
commit 5bff8ff11d

View File

@@ -969,8 +969,9 @@ jboolean Java_org_citron_citron_1emu_NativeLibrary_dumpRomFS(JNIEnv* env, jobjec
return false; return false;
} }
// Create output directory // Create output directory using VFS
const auto out_dir = std::make_shared<FileSys::RealVfsDirectory>(path); const auto path_str = Common::FS::PathToUTF8String(path);
const auto out_dir = vfs.CreateDirectory(path_str, FileSys::OpenMode::ReadWrite);
if (!out_dir || !out_dir->IsWritable()) { if (!out_dir || !out_dir->IsWritable()) {
return false; return false;
} }
@@ -983,12 +984,18 @@ jboolean Java_org_citron_citron_1emu_NativeLibrary_dumpRomFS(JNIEnv* env, jobjec
auto jlambdaInvokeMethod = env->GetMethodID( auto jlambdaInvokeMethod = env->GetMethodID(
jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
const auto callback = [env, jcallback, jlambdaInvokeMethod, &read_size, total_size]( // Helper to create Java Long objects
auto jLongClass = env->FindClass("java/lang/Long");
auto jLongValueOf = env->GetStaticMethodID(jLongClass, "valueOf", "(J)Ljava/lang/Long;");
const auto callback = [env, jcallback, jlambdaInvokeMethod, jLongClass, jLongValueOf, &read_size, total_size](
size_t current_read) -> bool { size_t current_read) -> bool {
read_size += current_read; read_size += current_read;
auto jwasCancelled = env->CallObjectMethod( auto jmax = env->CallStaticObjectMethod(jLongClass, jLongValueOf, static_cast<jlong>(total_size));
jcallback, jlambdaInvokeMethod, Common::Android::ToJLong(env, total_size), auto jprogress = env->CallStaticObjectMethod(jLongClass, jLongValueOf, static_cast<jlong>(read_size));
Common::Android::ToJLong(env, read_size)); auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod, jmax, jprogress);
env->DeleteLocalRef(jmax);
env->DeleteLocalRef(jprogress);
return Common::Android::GetJBoolean(env, jwasCancelled); return Common::Android::GetJBoolean(env, jwasCancelled);
}; };
@@ -1092,11 +1099,10 @@ jboolean Java_org_citron_citron_1emu_NativeLibrary_dumpExeFS(JNIEnv* env, jobjec
if (jdumpPath != nullptr) { if (jdumpPath != nullptr) {
const auto custom_path = Common::Android::GetJString(env, jdumpPath); const auto custom_path = Common::Android::GetJString(env, jdumpPath);
if (!custom_path.empty() && custom_path[0] == '/') { if (!custom_path.empty() && custom_path[0] == '/') {
// Create a real VFS directory from the custom path (native path only) // Create directory using VFS (native path only)
const auto custom_dir = std::make_shared<FileSys::RealVfsDirectory>( dump_dir = vfs.CreateDirectory(custom_path, FileSys::OpenMode::ReadWrite);
std::filesystem::path(custom_path)); if (!dump_dir || !dump_dir->IsWritable()) {
if (custom_dir && custom_dir->IsWritable()) { dump_dir = nullptr;
dump_dir = custom_dir;
} }
} }
} }