fs_android.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "common/android/android_common.h"
  4. #include "common/android/id_cache.h"
  5. #include "common/assert.h"
  6. #include "common/fs/fs_android.h"
  7. #include "common/string_util.h"
  8. namespace Common::FS::Android {
  9. void RegisterCallbacks(JNIEnv* env, jclass clazz) {
  10. env->GetJavaVM(&g_jvm);
  11. native_library = clazz;
  12. s_get_parent_directory = env->GetStaticMethodID(native_library, "getParentDirectory",
  13. "(Ljava/lang/String;)Ljava/lang/String;");
  14. s_get_filename = env->GetStaticMethodID(native_library, "getFilename",
  15. "(Ljava/lang/String;)Ljava/lang/String;");
  16. s_get_size = env->GetStaticMethodID(native_library, "getSize", "(Ljava/lang/String;)J");
  17. s_is_directory = env->GetStaticMethodID(native_library, "isDirectory", "(Ljava/lang/String;)Z");
  18. s_file_exists = env->GetStaticMethodID(native_library, "exists", "(Ljava/lang/String;)Z");
  19. s_open_content_uri = env->GetStaticMethodID(native_library, "openContentUri",
  20. "(Ljava/lang/String;Ljava/lang/String;)I");
  21. }
  22. void UnRegisterCallbacks() {
  23. s_get_parent_directory = nullptr;
  24. s_get_filename = nullptr;
  25. s_get_size = nullptr;
  26. s_is_directory = nullptr;
  27. s_file_exists = nullptr;
  28. s_open_content_uri = nullptr;
  29. }
  30. bool IsContentUri(const std::string& path) {
  31. constexpr std::string_view prefix = "content://";
  32. if (path.size() < prefix.size()) [[unlikely]] {
  33. return false;
  34. }
  35. return path.find(prefix) == 0;
  36. }
  37. s32 OpenContentUri(const std::string& filepath, OpenMode openmode) {
  38. if (s_open_content_uri == nullptr)
  39. return -1;
  40. const char* mode = "";
  41. switch (openmode) {
  42. case OpenMode::Read:
  43. mode = "r";
  44. break;
  45. default:
  46. UNIMPLEMENTED();
  47. return -1;
  48. }
  49. auto env = Common::Android::GetEnvForThread();
  50. jstring j_filepath = Common::Android::ToJString(env, filepath);
  51. jstring j_mode = Common::Android::ToJString(env, mode);
  52. return env->CallStaticIntMethod(native_library, s_open_content_uri, j_filepath, j_mode);
  53. }
  54. u64 GetSize(const std::string& filepath) {
  55. if (s_get_size == nullptr) {
  56. return 0;
  57. }
  58. auto env = Common::Android::GetEnvForThread();
  59. return static_cast<u64>(env->CallStaticLongMethod(
  60. native_library, s_get_size,
  61. Common::Android::ToJString(Common::Android::GetEnvForThread(), filepath)));
  62. }
  63. bool IsDirectory(const std::string& filepath) {
  64. if (s_is_directory == nullptr) {
  65. return 0;
  66. }
  67. auto env = Common::Android::GetEnvForThread();
  68. return env->CallStaticBooleanMethod(
  69. native_library, s_is_directory,
  70. Common::Android::ToJString(Common::Android::GetEnvForThread(), filepath));
  71. }
  72. bool Exists(const std::string& filepath) {
  73. if (s_file_exists == nullptr) {
  74. return 0;
  75. }
  76. auto env = Common::Android::GetEnvForThread();
  77. return env->CallStaticBooleanMethod(
  78. native_library, s_file_exists,
  79. Common::Android::ToJString(Common::Android::GetEnvForThread(), filepath));
  80. }
  81. std::string GetParentDirectory(const std::string& filepath) {
  82. if (s_get_parent_directory == nullptr) {
  83. return 0;
  84. }
  85. auto env = Common::Android::GetEnvForThread();
  86. jstring j_return = static_cast<jstring>(env->CallStaticObjectMethod(
  87. native_library, s_get_parent_directory, Common::Android::ToJString(env, filepath)));
  88. if (!j_return) {
  89. return {};
  90. }
  91. return Common::Android::GetJString(env, j_return);
  92. }
  93. std::string GetFilename(const std::string& filepath) {
  94. if (s_get_filename == nullptr) {
  95. return 0;
  96. }
  97. auto env = Common::Android::GetEnvForThread();
  98. jstring j_return = static_cast<jstring>(env->CallStaticObjectMethod(
  99. native_library, s_get_filename, Common::Android::ToJString(env, filepath)));
  100. if (!j_return) {
  101. return {};
  102. }
  103. return Common::Android::GetJString(env, j_return);
  104. }
  105. } // namespace Common::FS::Android