| 635 | } |
| 636 | |
| 637 | static void sendGameInfo(JNIEnv *env, jlong progressId, |
| 638 | std::span<const GameInfo> infos) { |
| 639 | auto gameRepositoryClass = ensure(env->FindClass("net/rpcsx/GameRepository")); |
| 640 | auto addMethodId = ensure(env->GetStaticMethodID( |
| 641 | gameRepositoryClass, "add", "([Lnet/rpcsx/GameInfo;J)V")); |
| 642 | auto gameClass = ensure(env->FindClass("net/rpcsx/GameInfo")); |
| 643 | |
| 644 | jmethodID gameConstructor = ensure(env->GetMethodID( |
| 645 | gameClass, "<init>", |
| 646 | "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V")); |
| 647 | |
| 648 | std::vector<jobject> objects; |
| 649 | objects.reserve(infos.size()); |
| 650 | |
| 651 | for (const auto &info : infos) { |
| 652 | auto path = Emu.GetCallbacks().resolve_path(info.path); |
| 653 | if (path.ends_with('/')) { |
| 654 | path.resize(path.size() - 1); |
| 655 | } |
| 656 | |
| 657 | objects.push_back(env->NewObject( |
| 658 | gameClass, gameConstructor, wrap(env, path), wrap(env, info.name), |
| 659 | wrap(env, Emu.GetCallbacks().resolve_path(info.iconPath)), |
| 660 | jint(info.flags))); |
| 661 | } |
| 662 | |
| 663 | auto result = env->NewObjectArray(objects.size(), gameClass, nullptr); |
| 664 | |
| 665 | for (std::size_t i = 0; i < objects.size(); ++i) { |
| 666 | env->SetObjectArrayElement(result, i, objects[i]); |
| 667 | } |
| 668 | |
| 669 | env->CallStaticVoidMethod(gameRepositoryClass, addMethodId, result, |
| 670 | progressId); |
| 671 | } |
| 672 | |
| 673 | static void sendVshBootable(JNIEnv *env, jlong progressId) { |
| 674 | auto dev_flash = g_cfg_vfs.get_dev_flash(); |
no test coverage detected