diff options
Diffstat (limited to 'src/common/fs/fs_android.cpp')
| -rw-r--r-- | src/common/fs/fs_android.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/common/fs/fs_android.cpp b/src/common/fs/fs_android.cpp index 298a79bac..1dd826a4a 100644 --- a/src/common/fs/fs_android.cpp +++ b/src/common/fs/fs_android.cpp | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include "common/fs/fs_android.h" | 4 | #include "common/fs/fs_android.h" |
| 5 | #include "common/string_util.h" | ||
| 5 | 6 | ||
| 6 | namespace Common::FS::Android { | 7 | namespace Common::FS::Android { |
| 7 | 8 | ||
| @@ -28,28 +29,35 @@ void RegisterCallbacks(JNIEnv* env, jclass clazz) { | |||
| 28 | env->GetJavaVM(&g_jvm); | 29 | env->GetJavaVM(&g_jvm); |
| 29 | native_library = clazz; | 30 | native_library = clazz; |
| 30 | 31 | ||
| 32 | #define FH(FunctionName, JMethodID, Caller, JMethodName, Signature) \ | ||
| 33 | F(JMethodID, JMethodName, Signature) | ||
| 31 | #define FR(FunctionName, ReturnValue, JMethodID, Caller, JMethodName, Signature) \ | 34 | #define FR(FunctionName, ReturnValue, JMethodID, Caller, JMethodName, Signature) \ |
| 32 | F(JMethodID, JMethodName, Signature) | 35 | F(JMethodID, JMethodName, Signature) |
| 33 | #define FS(FunctionName, ReturnValue, Parameters, JMethodID, JMethodName, Signature) \ | 36 | #define FS(FunctionName, ReturnValue, Parameters, JMethodID, JMethodName, Signature) \ |
| 34 | F(JMethodID, JMethodName, Signature) | 37 | F(JMethodID, JMethodName, Signature) |
| 35 | #define F(JMethodID, JMethodName, Signature) \ | 38 | #define F(JMethodID, JMethodName, Signature) \ |
| 36 | JMethodID = env->GetStaticMethodID(native_library, JMethodName, Signature); | 39 | JMethodID = env->GetStaticMethodID(native_library, JMethodName, Signature); |
| 40 | ANDROID_SINGLE_PATH_HELPER_FUNCTIONS(FH) | ||
| 37 | ANDROID_SINGLE_PATH_DETERMINE_FUNCTIONS(FR) | 41 | ANDROID_SINGLE_PATH_DETERMINE_FUNCTIONS(FR) |
| 38 | ANDROID_STORAGE_FUNCTIONS(FS) | 42 | ANDROID_STORAGE_FUNCTIONS(FS) |
| 39 | #undef F | 43 | #undef F |
| 40 | #undef FS | 44 | #undef FS |
| 41 | #undef FR | 45 | #undef FR |
| 46 | #undef FH | ||
| 42 | } | 47 | } |
| 43 | 48 | ||
| 44 | void UnRegisterCallbacks() { | 49 | void UnRegisterCallbacks() { |
| 50 | #define FH(FunctionName, JMethodID, Caller, JMethodName, Signature) F(JMethodID) | ||
| 45 | #define FR(FunctionName, ReturnValue, JMethodID, Caller, JMethodName, Signature) F(JMethodID) | 51 | #define FR(FunctionName, ReturnValue, JMethodID, Caller, JMethodName, Signature) F(JMethodID) |
| 46 | #define FS(FunctionName, ReturnValue, Parameters, JMethodID, JMethodName, Signature) F(JMethodID) | 52 | #define FS(FunctionName, ReturnValue, Parameters, JMethodID, JMethodName, Signature) F(JMethodID) |
| 47 | #define F(JMethodID) JMethodID = nullptr; | 53 | #define F(JMethodID) JMethodID = nullptr; |
| 54 | ANDROID_SINGLE_PATH_HELPER_FUNCTIONS(FH) | ||
| 48 | ANDROID_SINGLE_PATH_DETERMINE_FUNCTIONS(FR) | 55 | ANDROID_SINGLE_PATH_DETERMINE_FUNCTIONS(FR) |
| 49 | ANDROID_STORAGE_FUNCTIONS(FS) | 56 | ANDROID_STORAGE_FUNCTIONS(FS) |
| 50 | #undef F | 57 | #undef F |
| 51 | #undef FS | 58 | #undef FS |
| 52 | #undef FR | 59 | #undef FR |
| 60 | #undef FH | ||
| 53 | } | 61 | } |
| 54 | 62 | ||
| 55 | bool IsContentUri(const std::string& path) { | 63 | bool IsContentUri(const std::string& path) { |
| @@ -95,4 +103,29 @@ ANDROID_SINGLE_PATH_DETERMINE_FUNCTIONS(FR) | |||
| 95 | #undef F | 103 | #undef F |
| 96 | #undef FR | 104 | #undef FR |
| 97 | 105 | ||
| 106 | #define FH(FunctionName, JMethodID, Caller, JMethodName, Signature) \ | ||
| 107 | F(FunctionName, JMethodID, Caller) | ||
| 108 | #define F(FunctionName, JMethodID, Caller) \ | ||
| 109 | std::string FunctionName(const std::string& filepath) { \ | ||
| 110 | if (JMethodID == nullptr) { \ | ||
| 111 | return 0; \ | ||
| 112 | } \ | ||
| 113 | auto env = GetEnvForThread(); \ | ||
| 114 | jstring j_filepath = env->NewStringUTF(filepath.c_str()); \ | ||
| 115 | jstring j_return = \ | ||
| 116 | static_cast<jstring>(env->Caller(native_library, JMethodID, j_filepath)); \ | ||
| 117 | if (!j_return) { \ | ||
| 118 | return {}; \ | ||
| 119 | } \ | ||
| 120 | const jchar* jchars = env->GetStringChars(j_return, nullptr); \ | ||
| 121 | const jsize length = env->GetStringLength(j_return); \ | ||
| 122 | const std::u16string_view string_view(reinterpret_cast<const char16_t*>(jchars), length); \ | ||
| 123 | const std::string converted_string = Common::UTF16ToUTF8(string_view); \ | ||
| 124 | env->ReleaseStringChars(j_return, jchars); \ | ||
| 125 | return converted_string; \ | ||
| 126 | } | ||
| 127 | ANDROID_SINGLE_PATH_HELPER_FUNCTIONS(FH) | ||
| 128 | #undef F | ||
| 129 | #undef FH | ||
| 130 | |||
| 98 | } // namespace Common::FS::Android | 131 | } // namespace Common::FS::Android |