| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
- // SPDX-License-Identifier: GPL-2.0-or-later
- #include "common/android/android_common.h"
- #include "common/android/id_cache.h"
- #include "common/assert.h"
- #include "common/fs/fs_android.h"
- #include "common/string_util.h"
- namespace Common::FS::Android {
- void RegisterCallbacks(JNIEnv* env, jclass clazz) {
- env->GetJavaVM(&g_jvm);
- native_library = clazz;
- s_get_parent_directory = env->GetStaticMethodID(native_library, "getParentDirectory",
- "(Ljava/lang/String;)Ljava/lang/String;");
- s_get_filename = env->GetStaticMethodID(native_library, "getFilename",
- "(Ljava/lang/String;)Ljava/lang/String;");
- s_get_size = env->GetStaticMethodID(native_library, "getSize", "(Ljava/lang/String;)J");
- s_is_directory = env->GetStaticMethodID(native_library, "isDirectory", "(Ljava/lang/String;)Z");
- s_file_exists = env->GetStaticMethodID(native_library, "exists", "(Ljava/lang/String;)Z");
- s_open_content_uri = env->GetStaticMethodID(native_library, "openContentUri",
- "(Ljava/lang/String;Ljava/lang/String;)I");
- }
- void UnRegisterCallbacks() {
- s_get_parent_directory = nullptr;
- s_get_filename = nullptr;
- s_get_size = nullptr;
- s_is_directory = nullptr;
- s_file_exists = nullptr;
- s_open_content_uri = nullptr;
- }
- bool IsContentUri(const std::string& path) {
- constexpr std::string_view prefix = "content://";
- if (path.size() < prefix.size()) [[unlikely]] {
- return false;
- }
- return path.find(prefix) == 0;
- }
- s32 OpenContentUri(const std::string& filepath, OpenMode openmode) {
- if (s_open_content_uri == nullptr)
- return -1;
- const char* mode = "";
- switch (openmode) {
- case OpenMode::Read:
- mode = "r";
- break;
- default:
- UNIMPLEMENTED();
- return -1;
- }
- auto env = Common::Android::GetEnvForThread();
- jstring j_filepath = Common::Android::ToJString(env, filepath);
- jstring j_mode = Common::Android::ToJString(env, mode);
- return env->CallStaticIntMethod(native_library, s_open_content_uri, j_filepath, j_mode);
- }
- u64 GetSize(const std::string& filepath) {
- if (s_get_size == nullptr) {
- return 0;
- }
- auto env = Common::Android::GetEnvForThread();
- return static_cast<u64>(env->CallStaticLongMethod(
- native_library, s_get_size,
- Common::Android::ToJString(Common::Android::GetEnvForThread(), filepath)));
- }
- bool IsDirectory(const std::string& filepath) {
- if (s_is_directory == nullptr) {
- return 0;
- }
- auto env = Common::Android::GetEnvForThread();
- return env->CallStaticBooleanMethod(
- native_library, s_is_directory,
- Common::Android::ToJString(Common::Android::GetEnvForThread(), filepath));
- }
- bool Exists(const std::string& filepath) {
- if (s_file_exists == nullptr) {
- return 0;
- }
- auto env = Common::Android::GetEnvForThread();
- return env->CallStaticBooleanMethod(
- native_library, s_file_exists,
- Common::Android::ToJString(Common::Android::GetEnvForThread(), filepath));
- }
- std::string GetParentDirectory(const std::string& filepath) {
- if (s_get_parent_directory == nullptr) {
- return 0;
- }
- auto env = Common::Android::GetEnvForThread();
- jstring j_return = static_cast<jstring>(env->CallStaticObjectMethod(
- native_library, s_get_parent_directory, Common::Android::ToJString(env, filepath)));
- if (!j_return) {
- return {};
- }
- return Common::Android::GetJString(env, j_return);
- }
- std::string GetFilename(const std::string& filepath) {
- if (s_get_filename == nullptr) {
- return 0;
- }
- auto env = Common::Android::GetEnvForThread();
- jstring j_return = static_cast<jstring>(env->CallStaticObjectMethod(
- native_library, s_get_filename, Common::Android::ToJString(env, filepath)));
- if (!j_return) {
- return {};
- }
- return Common::Android::GetJString(env, j_return);
- }
- } // namespace Common::FS::Android
|