| | |
| | |
| |
|
| | #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); |
| | } |
| |
|
| | } |
| |
|