diff options
Diffstat (limited to 'src/android')
-rw-r--r-- | src/android/app/src/main/jni/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/android/app/src/main/jni/android_common/android_common.cpp | 60 | ||||
-rw-r--r-- | src/android/app/src/main/jni/android_common/android_common.h | 22 | ||||
-rw-r--r-- | src/android/app/src/main/jni/applets/software_keyboard.cpp | 277 | ||||
-rw-r--r-- | src/android/app/src/main/jni/applets/software_keyboard.h | 78 | ||||
-rw-r--r-- | src/android/app/src/main/jni/emu_window/emu_window.cpp | 4 | ||||
-rw-r--r-- | src/android/app/src/main/jni/game_metadata.cpp | 22 | ||||
-rw-r--r-- | src/android/app/src/main/jni/id_cache.cpp | 428 | ||||
-rw-r--r-- | src/android/app/src/main/jni/id_cache.h | 68 | ||||
-rw-r--r-- | src/android/app/src/main/jni/native.cpp | 125 | ||||
-rw-r--r-- | src/android/app/src/main/jni/native.h | 6 | ||||
-rw-r--r-- | src/android/app/src/main/jni/native_config.cpp | 121 | ||||
-rw-r--r-- | src/android/app/src/main/jni/native_log.cpp | 13 |
13 files changed, 159 insertions, 1071 deletions
diff --git a/src/android/app/src/main/jni/CMakeLists.txt b/src/android/app/src/main/jni/CMakeLists.txt index abc6055ab..20b319c12 100644 --- a/src/android/app/src/main/jni/CMakeLists.txt +++ b/src/android/app/src/main/jni/CMakeLists.txt @@ -2,14 +2,8 @@ # SPDX-License-Identifier: GPL-3.0-or-later add_library(yuzu-android SHARED - android_common/android_common.cpp - android_common/android_common.h - applets/software_keyboard.cpp - applets/software_keyboard.h emu_window/emu_window.cpp emu_window/emu_window.h - id_cache.cpp - id_cache.h native.cpp native.h native_config.cpp diff --git a/src/android/app/src/main/jni/android_common/android_common.cpp b/src/android/app/src/main/jni/android_common/android_common.cpp deleted file mode 100644 index 7018a52af..000000000 --- a/src/android/app/src/main/jni/android_common/android_common.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include "jni/android_common/android_common.h" - -#include <string> -#include <string_view> - -#include <jni.h> - -#include "common/string_util.h" -#include "jni/id_cache.h" - -std::string GetJString(JNIEnv* env, jstring jstr) { - if (!jstr) { - return {}; - } - - const jchar* jchars = env->GetStringChars(jstr, nullptr); - const jsize length = env->GetStringLength(jstr); - const std::u16string_view string_view(reinterpret_cast<const char16_t*>(jchars), length); - const std::string converted_string = Common::UTF16ToUTF8(string_view); - env->ReleaseStringChars(jstr, jchars); - - return converted_string; -} - -jstring ToJString(JNIEnv* env, std::string_view str) { - const std::u16string converted_string = Common::UTF8ToUTF16(str); - return env->NewString(reinterpret_cast<const jchar*>(converted_string.data()), - static_cast<jint>(converted_string.size())); -} - -jstring ToJString(JNIEnv* env, std::u16string_view str) { - return ToJString(env, Common::UTF16ToUTF8(str)); -} - -double GetJDouble(JNIEnv* env, jobject jdouble) { - return env->GetDoubleField(jdouble, IDCache::GetDoubleValueField()); -} - -jobject ToJDouble(JNIEnv* env, double value) { - return env->NewObject(IDCache::GetDoubleClass(), IDCache::GetDoubleConstructor(), value); -} - -s32 GetJInteger(JNIEnv* env, jobject jinteger) { - return env->GetIntField(jinteger, IDCache::GetIntegerValueField()); -} - -jobject ToJInteger(JNIEnv* env, s32 value) { - return env->NewObject(IDCache::GetIntegerClass(), IDCache::GetIntegerConstructor(), value); -} - -bool GetJBoolean(JNIEnv* env, jobject jboolean) { - return env->GetBooleanField(jboolean, IDCache::GetBooleanValueField()); -} - -jobject ToJBoolean(JNIEnv* env, bool value) { - return env->NewObject(IDCache::GetBooleanClass(), IDCache::GetBooleanConstructor(), value); -} diff --git a/src/android/app/src/main/jni/android_common/android_common.h b/src/android/app/src/main/jni/android_common/android_common.h deleted file mode 100644 index 29a338c0a..000000000 --- a/src/android/app/src/main/jni/android_common/android_common.h +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include <string> - -#include <jni.h> -#include "common/common_types.h" - -std::string GetJString(JNIEnv* env, jstring jstr); -jstring ToJString(JNIEnv* env, std::string_view str); -jstring ToJString(JNIEnv* env, std::u16string_view str); - -double GetJDouble(JNIEnv* env, jobject jdouble); -jobject ToJDouble(JNIEnv* env, double value); - -s32 GetJInteger(JNIEnv* env, jobject jinteger); -jobject ToJInteger(JNIEnv* env, s32 value); - -bool GetJBoolean(JNIEnv* env, jobject jboolean); -jobject ToJBoolean(JNIEnv* env, bool value); diff --git a/src/android/app/src/main/jni/applets/software_keyboard.cpp b/src/android/app/src/main/jni/applets/software_keyboard.cpp deleted file mode 100644 index 9943483e8..000000000 --- a/src/android/app/src/main/jni/applets/software_keyboard.cpp +++ /dev/null @@ -1,277 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include <map> -#include <thread> - -#include <jni.h> - -#include "common/logging/log.h" -#include "common/string_util.h" -#include "core/core.h" -#include "jni/android_common/android_common.h" -#include "jni/applets/software_keyboard.h" -#include "jni/id_cache.h" - -static jclass s_software_keyboard_class; -static jclass s_keyboard_config_class; -static jclass s_keyboard_data_class; -static jmethodID s_swkbd_execute_normal; -static jmethodID s_swkbd_execute_inline; - -namespace SoftwareKeyboard { - -static jobject ToJKeyboardParams(const Core::Frontend::KeyboardInitializeParameters& config) { - JNIEnv* env = IDCache::GetEnvForThread(); - jobject object = env->AllocObject(s_keyboard_config_class); - - env->SetObjectField(object, - env->GetFieldID(s_keyboard_config_class, "ok_text", "Ljava/lang/String;"), - ToJString(env, config.ok_text)); - env->SetObjectField( - object, env->GetFieldID(s_keyboard_config_class, "header_text", "Ljava/lang/String;"), - ToJString(env, config.header_text)); - env->SetObjectField(object, - env->GetFieldID(s_keyboard_config_class, "sub_text", "Ljava/lang/String;"), - ToJString(env, config.sub_text)); - env->SetObjectField( - object, env->GetFieldID(s_keyboard_config_class, "guide_text", "Ljava/lang/String;"), - ToJString(env, config.guide_text)); - env->SetObjectField( - object, env->GetFieldID(s_keyboard_config_class, "initial_text", "Ljava/lang/String;"), - ToJString(env, config.initial_text)); - env->SetShortField(object, - env->GetFieldID(s_keyboard_config_class, "left_optional_symbol_key", "S"), - static_cast<jshort>(config.left_optional_symbol_key)); - env->SetShortField(object, - env->GetFieldID(s_keyboard_config_class, "right_optional_symbol_key", "S"), - static_cast<jshort>(config.right_optional_symbol_key)); - env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "max_text_length", "I"), - static_cast<jint>(config.max_text_length)); - env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "min_text_length", "I"), - static_cast<jint>(config.min_text_length)); - env->SetIntField(object, - env->GetFieldID(s_keyboard_config_class, "initial_cursor_position", "I"), - static_cast<jint>(config.initial_cursor_position)); - env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "type", "I"), - static_cast<jint>(config.type)); - env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "password_mode", "I"), - static_cast<jint>(config.password_mode)); - env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "text_draw_type", "I"), - static_cast<jint>(config.text_draw_type)); - env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "key_disable_flags", "I"), - static_cast<jint>(config.key_disable_flags.raw)); - env->SetBooleanField(object, - env->GetFieldID(s_keyboard_config_class, "use_blur_background", "Z"), - static_cast<jboolean>(config.use_blur_background)); - env->SetBooleanField(object, - env->GetFieldID(s_keyboard_config_class, "enable_backspace_button", "Z"), - static_cast<jboolean>(config.enable_backspace_button)); - env->SetBooleanField(object, - env->GetFieldID(s_keyboard_config_class, "enable_return_button", "Z"), - static_cast<jboolean>(config.enable_return_button)); - env->SetBooleanField(object, - env->GetFieldID(s_keyboard_config_class, "disable_cancel_button", "Z"), - static_cast<jboolean>(config.disable_cancel_button)); - - return object; -} - -AndroidKeyboard::ResultData AndroidKeyboard::ResultData::CreateFromFrontend(jobject object) { - JNIEnv* env = IDCache::GetEnvForThread(); - const jstring string = reinterpret_cast<jstring>(env->GetObjectField( - object, env->GetFieldID(s_keyboard_data_class, "text", "Ljava/lang/String;"))); - return ResultData{GetJString(env, string), - static_cast<Service::AM::Frontend::SwkbdResult>(env->GetIntField( - object, env->GetFieldID(s_keyboard_data_class, "result", "I")))}; -} - -AndroidKeyboard::~AndroidKeyboard() = default; - -void AndroidKeyboard::InitializeKeyboard( - bool is_inline, Core::Frontend::KeyboardInitializeParameters initialize_parameters, - SubmitNormalCallback submit_normal_callback_, SubmitInlineCallback submit_inline_callback_) { - if (is_inline) { - LOG_WARNING( - Frontend, - "(STUBBED) called, backend requested to initialize the inline software keyboard."); - - submit_inline_callback = std::move(submit_inline_callback_); - } else { - LOG_WARNING( - Frontend, - "(STUBBED) called, backend requested to initialize the normal software keyboard."); - - submit_normal_callback = std::move(submit_normal_callback_); - } - - parameters = std::move(initialize_parameters); - - LOG_INFO(Frontend, - "\nKeyboardInitializeParameters:" - "\nok_text={}" - "\nheader_text={}" - "\nsub_text={}" - "\nguide_text={}" - "\ninitial_text={}" - "\nmax_text_length={}" - "\nmin_text_length={}" - "\ninitial_cursor_position={}" - "\ntype={}" - "\npassword_mode={}" - "\ntext_draw_type={}" - "\nkey_disable_flags={}" - "\nuse_blur_background={}" - "\nenable_backspace_button={}" - "\nenable_return_button={}" - "\ndisable_cancel_button={}", - Common::UTF16ToUTF8(parameters.ok_text), Common::UTF16ToUTF8(parameters.header_text), - Common::UTF16ToUTF8(parameters.sub_text), Common::UTF16ToUTF8(parameters.guide_text), - Common::UTF16ToUTF8(parameters.initial_text), parameters.max_text_length, - parameters.min_text_length, parameters.initial_cursor_position, parameters.type, - parameters.password_mode, parameters.text_draw_type, parameters.key_disable_flags.raw, - parameters.use_blur_background, parameters.enable_backspace_button, - parameters.enable_return_button, parameters.disable_cancel_button); -} - -void AndroidKeyboard::ShowNormalKeyboard() const { - LOG_DEBUG(Frontend, "called, backend requested to show the normal software keyboard."); - - ResultData data{}; - - // Pivot to a new thread, as we cannot call GetEnvForThread() from a Fiber. - std::thread([&] { - data = ResultData::CreateFromFrontend(IDCache::GetEnvForThread()->CallStaticObjectMethod( - s_software_keyboard_class, s_swkbd_execute_normal, ToJKeyboardParams(parameters))); - }).join(); - - SubmitNormalText(data); -} - -void AndroidKeyboard::ShowTextCheckDialog( - Service::AM::Frontend::SwkbdTextCheckResult text_check_result, - std::u16string text_check_message) const { - LOG_WARNING(Frontend, "(STUBBED) called, backend requested to show the text check dialog."); -} - -void AndroidKeyboard::ShowInlineKeyboard( - Core::Frontend::InlineAppearParameters appear_parameters) const { - LOG_WARNING(Frontend, - "(STUBBED) called, backend requested to show the inline software keyboard."); - - LOG_INFO(Frontend, - "\nInlineAppearParameters:" - "\nmax_text_length={}" - "\nmin_text_length={}" - "\nkey_top_scale_x={}" - "\nkey_top_scale_y={}" - "\nkey_top_translate_x={}" - "\nkey_top_translate_y={}" - "\ntype={}" - "\nkey_disable_flags={}" - "\nkey_top_as_floating={}" - "\nenable_backspace_button={}" - "\nenable_return_button={}" - "\ndisable_cancel_button={}", - appear_parameters.max_text_length, appear_parameters.min_text_length, - appear_parameters.key_top_scale_x, appear_parameters.key_top_scale_y, - appear_parameters.key_top_translate_x, appear_parameters.key_top_translate_y, - appear_parameters.type, appear_parameters.key_disable_flags.raw, - appear_parameters.key_top_as_floating, appear_parameters.enable_backspace_button, - appear_parameters.enable_return_button, appear_parameters.disable_cancel_button); - - // Pivot to a new thread, as we cannot call GetEnvForThread() from a Fiber. - m_is_inline_active = true; - std::thread([&] { - IDCache::GetEnvForThread()->CallStaticVoidMethod( - s_software_keyboard_class, s_swkbd_execute_inline, ToJKeyboardParams(parameters)); - }).join(); -} - -void AndroidKeyboard::HideInlineKeyboard() const { - LOG_WARNING(Frontend, - "(STUBBED) called, backend requested to hide the inline software keyboard."); -} - -void AndroidKeyboard::InlineTextChanged( - Core::Frontend::InlineTextParameters text_parameters) const { - LOG_WARNING(Frontend, - "(STUBBED) called, backend requested to change the inline keyboard text."); - - LOG_INFO(Frontend, - "\nInlineTextParameters:" - "\ninput_text={}" - "\ncursor_position={}", - Common::UTF16ToUTF8(text_parameters.input_text), text_parameters.cursor_position); - - submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, - text_parameters.input_text, text_parameters.cursor_position); -} - -void AndroidKeyboard::ExitKeyboard() const { - LOG_WARNING(Frontend, "(STUBBED) called, backend requested to exit the software keyboard."); -} - -void AndroidKeyboard::SubmitInlineKeyboardText(std::u16string submitted_text) { - if (!m_is_inline_active) { - return; - } - - m_current_text += submitted_text; - - submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text, - m_current_text.size()); -} - -void AndroidKeyboard::SubmitInlineKeyboardInput(int key_code) { - static constexpr int KEYCODE_BACK = 4; - static constexpr int KEYCODE_ENTER = 66; - static constexpr int KEYCODE_DEL = 67; - - if (!m_is_inline_active) { - return; - } - - switch (key_code) { - case KEYCODE_BACK: - case KEYCODE_ENTER: - m_is_inline_active = false; - submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::DecidedEnter, m_current_text, - static_cast<s32>(m_current_text.size())); - break; - case KEYCODE_DEL: - m_current_text.pop_back(); - submit_inline_callback(Service::AM::Frontend::SwkbdReplyType::ChangedString, m_current_text, - m_current_text.size()); - break; - } -} - -void AndroidKeyboard::SubmitNormalText(const ResultData& data) const { - submit_normal_callback(data.result, Common::UTF8ToUTF16(data.text), true); -} - -void InitJNI(JNIEnv* env) { - s_software_keyboard_class = reinterpret_cast<jclass>( - env->NewGlobalRef(env->FindClass("org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard"))); - s_keyboard_config_class = reinterpret_cast<jclass>(env->NewGlobalRef( - env->FindClass("org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig"))); - s_keyboard_data_class = reinterpret_cast<jclass>(env->NewGlobalRef( - env->FindClass("org/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard$KeyboardData"))); - - s_swkbd_execute_normal = env->GetStaticMethodID( - s_software_keyboard_class, "executeNormal", - "(Lorg/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)Lorg/yuzu/yuzu_emu/" - "applets/keyboard/SoftwareKeyboard$KeyboardData;"); - s_swkbd_execute_inline = env->GetStaticMethodID( - s_software_keyboard_class, "executeInline", - "(Lorg/yuzu/yuzu_emu/applets/keyboard/SoftwareKeyboard$KeyboardConfig;)V"); -} - -void CleanupJNI(JNIEnv* env) { - env->DeleteGlobalRef(s_software_keyboard_class); - env->DeleteGlobalRef(s_keyboard_config_class); - env->DeleteGlobalRef(s_keyboard_data_class); -} - -} // namespace SoftwareKeyboard diff --git a/src/android/app/src/main/jni/applets/software_keyboard.h b/src/android/app/src/main/jni/applets/software_keyboard.h deleted file mode 100644 index 2affc01f6..000000000 --- a/src/android/app/src/main/jni/applets/software_keyboard.h +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#pragma once - -#include <jni.h> - -#include "core/frontend/applets/software_keyboard.h" - -namespace SoftwareKeyboard { - -class AndroidKeyboard final : public Core::Frontend::SoftwareKeyboardApplet { -public: - ~AndroidKeyboard() override; - - void Close() const override { - ExitKeyboard(); - } - - void InitializeKeyboard(bool is_inline, - Core::Frontend::KeyboardInitializeParameters initialize_parameters, - SubmitNormalCallback submit_normal_callback_, - SubmitInlineCallback submit_inline_callback_) override; - - void ShowNormalKeyboard() const override; - - void ShowTextCheckDialog(Service::AM::Frontend::SwkbdTextCheckResult text_check_result, - std::u16string text_check_message) const override; - - void ShowInlineKeyboard( - Core::Frontend::InlineAppearParameters appear_parameters) const override; - - void HideInlineKeyboard() const override; - - void InlineTextChanged(Core::Frontend::InlineTextParameters text_parameters) const override; - - void ExitKeyboard() const override; - - void SubmitInlineKeyboardText(std::u16string submitted_text); - - void SubmitInlineKeyboardInput(int key_code); - -private: - struct ResultData { - static ResultData CreateFromFrontend(jobject object); - - std::string text; - Service::AM::Frontend::SwkbdResult result{}; - }; - - void SubmitNormalText(const ResultData& result) const; - - Core::Frontend::KeyboardInitializeParameters parameters{}; - - mutable SubmitNormalCallback submit_normal_callback; - mutable SubmitInlineCallback submit_inline_callback; - -private: - mutable bool m_is_inline_active{}; - std::u16string m_current_text; -}; - -// Should be called in JNI_Load -void InitJNI(JNIEnv* env); - -// Should be called in JNI_Unload -void CleanupJNI(JNIEnv* env); - -} // namespace SoftwareKeyboard - -// Native function calls -extern "C" { -JNIEXPORT jobject JNICALL Java_org_citra_citra_1emu_applets_SoftwareKeyboard_ValidateFilters( - JNIEnv* env, jclass clazz, jstring text); - -JNIEXPORT jobject JNICALL Java_org_citra_citra_1emu_applets_SoftwareKeyboard_ValidateInput( - JNIEnv* env, jclass clazz, jstring text); -} diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp index c4f631924..c927cddda 100644 --- a/src/android/app/src/main/jni/emu_window/emu_window.cpp +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -3,6 +3,7 @@ #include <android/native_window_jni.h> +#include "common/android/id_cache.h" #include "common/logging/log.h" #include "input_common/drivers/touch_screen.h" #include "input_common/drivers/virtual_amiibo.h" @@ -60,7 +61,8 @@ void EmuWindow_Android::OnRemoveNfcTag() { void EmuWindow_Android::OnFrameDisplayed() { if (!m_first_frame) { - EmulationSession::GetInstance().OnEmulationStarted(); + Common::Android::RunJNIOnFiber<void>( + [&](JNIEnv* env) { EmulationSession::GetInstance().OnEmulationStarted(); }); m_first_frame = true; } } diff --git a/src/android/app/src/main/jni/game_metadata.cpp b/src/android/app/src/main/jni/game_metadata.cpp index 8f0da1413..c33763b47 100644 --- a/src/android/app/src/main/jni/game_metadata.cpp +++ b/src/android/app/src/main/jni/game_metadata.cpp @@ -1,13 +1,12 @@ // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include "common/android/android_common.h" #include "core/core.h" #include "core/file_sys/fs_filesystem.h" #include "core/file_sys/patch_manager.h" #include "core/loader/loader.h" #include "core/loader/nro.h" -#include "jni.h" -#include "jni/android_common/android_common.h" #include "native.h" struct RomMetadata { @@ -79,7 +78,7 @@ extern "C" { jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobject obj, jstring jpath) { const auto file = EmulationSession::GetInstance().System().GetFilesystem()->OpenFile( - GetJString(env, jpath), FileSys::OpenMode::Read); + Common::Android::GetJString(env, jpath), FileSys::OpenMode::Read); if (!file) { return false; } @@ -104,27 +103,31 @@ jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobj jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getTitle(JNIEnv* env, jobject obj, jstring jpath) { - return ToJString(env, GetRomMetadata(GetJString(env, jpath)).title); + return Common::Android::ToJString( + env, GetRomMetadata(Common::Android::GetJString(env, jpath)).title); } jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getProgramId(JNIEnv* env, jobject obj, jstring jpath) { - return ToJString(env, std::to_string(GetRomMetadata(GetJString(env, jpath)).programId)); + return Common::Android::ToJString( + env, std::to_string(GetRomMetadata(Common::Android::GetJString(env, jpath)).programId)); } jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getDeveloper(JNIEnv* env, jobject obj, jstring jpath) { - return ToJString(env, GetRomMetadata(GetJString(env, jpath)).developer); + return Common::Android::ToJString( + env, GetRomMetadata(Common::Android::GetJString(env, jpath)).developer); } jstring Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getVersion(JNIEnv* env, jobject obj, jstring jpath, jboolean jreload) { - return ToJString(env, GetRomMetadata(GetJString(env, jpath), jreload).version); + return Common::Android::ToJString( + env, GetRomMetadata(Common::Android::GetJString(env, jpath), jreload).version); } jbyteArray Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobject obj, jstring jpath) { - auto icon_data = GetRomMetadata(GetJString(env, jpath)).icon; + auto icon_data = GetRomMetadata(Common::Android::GetJString(env, jpath)).icon; jbyteArray icon = env->NewByteArray(static_cast<jsize>(icon_data.size())); env->SetByteArrayRegion(icon, 0, env->GetArrayLength(icon), reinterpret_cast<jbyte*>(icon_data.data())); @@ -133,7 +136,8 @@ jbyteArray Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIcon(JNIEnv* env, jobje jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsHomebrew(JNIEnv* env, jobject obj, jstring jpath) { - return static_cast<jboolean>(GetRomMetadata(GetJString(env, jpath)).isHomebrew); + return static_cast<jboolean>( + GetRomMetadata(Common::Android::GetJString(env, jpath)).isHomebrew); } void Java_org_yuzu_yuzu_1emu_utils_GameMetadata_resetMetadata(JNIEnv* env, jobject obj) { diff --git a/src/android/app/src/main/jni/id_cache.cpp b/src/android/app/src/main/jni/id_cache.cpp deleted file mode 100644 index f30100bd8..000000000 --- a/src/android/app/src/main/jni/id_cache.cpp +++ /dev/null @@ -1,428 +0,0 @@ -// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later - -#include <jni.h> - -#include "common/assert.h" -#include "common/fs/fs_android.h" -#include "jni/applets/software_keyboard.h" -#include "jni/id_cache.h" -#include "video_core/rasterizer_interface.h" - -static JavaVM* s_java_vm; -static jclass s_native_library_class; -static jclass s_disk_cache_progress_class; -static jclass s_load_callback_stage_class; -static jclass s_game_dir_class; -static jmethodID s_game_dir_constructor; -static jmethodID s_exit_emulation_activity; -static jmethodID s_disk_cache_load_progress; -static jmethodID s_on_emulation_started; -static jmethodID s_on_emulation_stopped; -static jmethodID s_on_program_changed; - -static jclass s_game_class; -static jmethodID s_game_constructor; -static jfieldID s_game_title_field; -static jfieldID s_game_path_field; -static jfieldID s_game_program_id_field; -static jfieldID s_game_developer_field; -static jfieldID s_game_version_field; -static jfieldID s_game_is_homebrew_field; - -static jclass s_string_class; -static jclass s_pair_class; -static jmethodID s_pair_constructor; -static jfieldID s_pair_first_field; -static jfieldID s_pair_second_field; - -static jclass s_overlay_control_data_class; -static jmethodID s_overlay_control_data_constructor; -static jfieldID s_overlay_control_data_id_field; -static jfieldID s_overlay_control_data_enabled_field; -static jfieldID s_overlay_control_data_landscape_position_field; -static jfieldID s_overlay_control_data_portrait_position_field; -static jfieldID s_overlay_control_data_foldable_position_field; - -static jclass s_patch_class; -static jmethodID s_patch_constructor; -static jfieldID s_patch_enabled_field; -static jfieldID s_patch_name_field; -static jfieldID s_patch_version_field; -static jfieldID s_patch_type_field; -static jfieldID s_patch_program_id_field; -static jfieldID s_patch_title_id_field; - -static jclass s_double_class; -static jmethodID s_double_constructor; -static jfieldID s_double_value_field; - -static jclass s_integer_class; -static jmethodID s_integer_constructor; -static jfieldID s_integer_value_field; - -static jclass s_boolean_class; -static jmethodID s_boolean_constructor; -static jfieldID s_boolean_value_field; - -static constexpr jint JNI_VERSION = JNI_VERSION_1_6; - -namespace IDCache { - -JNIEnv* GetEnvForThread() { - thread_local static struct OwnedEnv { - OwnedEnv() { - status = s_java_vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6); - if (status == JNI_EDETACHED) - s_java_vm->AttachCurrentThread(&env, nullptr); - } - - ~OwnedEnv() { - if (status == JNI_EDETACHED) - s_java_vm->DetachCurrentThread(); - } - - int status; - JNIEnv* env = nullptr; - } owned; - return owned.env; -} - -jclass GetNativeLibraryClass() { - return s_native_library_class; -} - -jclass GetDiskCacheProgressClass() { - return s_disk_cache_progress_class; -} - -jclass GetDiskCacheLoadCallbackStageClass() { - return s_load_callback_stage_class; -} - -jclass GetGameDirClass() { - return s_game_dir_class; -} - -jmethodID GetGameDirConstructor() { - return s_game_dir_constructor; -} - -jmethodID GetExitEmulationActivity() { - return s_exit_emulation_activity; -} - -jmethodID GetDiskCacheLoadProgress() { - return s_disk_cache_load_progress; -} - -jmethodID GetOnEmulationStarted() { - return s_on_emulation_started; -} - -jmethodID GetOnEmulationStopped() { - return s_on_emulation_stopped; -} - -jmethodID GetOnProgramChanged() { - return s_on_program_changed; -} - -jclass GetGameClass() { - return s_game_class; -} - -jmethodID GetGameConstructor() { - return s_game_constructor; -} - -jfieldID GetGameTitleField() { - return s_game_title_field; -} - -jfieldID GetGamePathField() { - return s_game_path_field; -} - -jfieldID GetGameProgramIdField() { - return s_game_program_id_field; -} - -jfieldID GetGameDeveloperField() { - return s_game_developer_field; -} - -jfieldID GetGameVersionField() { - return s_game_version_field; -} - -jfieldID GetGameIsHomebrewField() { - return s_game_is_homebrew_field; -} - -jclass GetStringClass() { - return s_string_class; -} - -jclass GetPairClass() { - return s_pair_class; -} - -jmethodID GetPairConstructor() { - return s_pair_constructor; -} - -jfieldID GetPairFirstField() { - return s_pair_first_field; -} - -jfieldID GetPairSecondField() { - return s_pair_second_field; -} - -jclass GetOverlayControlDataClass() { - return s_overlay_control_data_class; -} - -jmethodID GetOverlayControlDataConstructor() { - return s_overlay_control_data_constructor; -} - -jfieldID GetOverlayControlDataIdField() { - return s_overlay_control_data_id_field; -} - -jfieldID GetOverlayControlDataEnabledField() { - return s_overlay_control_data_enabled_field; -} - -jfieldID GetOverlayControlDataLandscapePositionField() { - return s_overlay_control_data_landscape_position_field; -} - -jfieldID GetOverlayControlDataPortraitPositionField() { - return s_overlay_control_data_portrait_position_field; -} - -jfieldID GetOverlayControlDataFoldablePositionField() { - return s_overlay_control_data_foldable_position_field; -} - -jclass GetPatchClass() { - return s_patch_class; -} - -jmethodID GetPatchConstructor() { - return s_patch_constructor; -} - -jfieldID GetPatchEnabledField() { - return s_patch_enabled_field; -} - -jfieldID GetPatchNameField() { - return s_patch_name_field; -} - -jfieldID GetPatchVersionField() { - return s_patch_version_field; -} - -jfieldID GetPatchTypeField() { - return s_patch_type_field; -} - -jfieldID GetPatchProgramIdField() { - return s_patch_program_id_field; -} - -jfieldID GetPatchTitleIdField() { - return s_patch_title_id_field; -} - -jclass GetDoubleClass() { - return s_double_class; -} - -jmethodID GetDoubleConstructor() { - return s_double_constructor; -} - -jfieldID GetDoubleValueField() { - return s_double_value_field; -} - -jclass GetIntegerClass() { - return s_integer_class; -} - -jmethodID GetIntegerConstructor() { - return s_integer_constructor; -} - -jfieldID GetIntegerValueField() { - return s_integer_value_field; -} - -jclass GetBooleanClass() { - return s_boolean_class; -} - -jmethodID GetBooleanConstructor() { - return s_boolean_constructor; -} - -jfieldID GetBooleanValueField() { - return s_boolean_value_field; -} - -} // namespace IDCache - -#ifdef __cplusplus -extern "C" { -#endif - -jint JNI_OnLoad(JavaVM* vm, void* reserved) { - s_java_vm = vm; - - JNIEnv* env; - if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK) - return JNI_ERR; - - // Initialize Java classes - const jclass native_library_class = env->FindClass("org/yuzu/yuzu_emu/NativeLibrary"); - s_native_library_class = reinterpret_cast<jclass>(env->NewGlobalRef(native_library_class)); - s_disk_cache_progress_class = reinterpret_cast<jclass>(env->NewGlobalRef( - env->FindClass("org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress"))); - s_load_callback_stage_class = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass( - "org/yuzu/yuzu_emu/disk_shader_cache/DiskShaderCacheProgress$LoadCallbackStage"))); - - const jclass game_dir_class = env->FindClass("org/yuzu/yuzu_emu/model/GameDir"); - s_game_dir_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_dir_class)); - s_game_dir_constructor = env->GetMethodID(game_dir_class, "<init>", "(Ljava/lang/String;Z)V"); - env->DeleteLocalRef(game_dir_class); - - // Initialize methods - s_exit_emulation_activity = - env->GetStaticMethodID(s_native_library_class, "exitEmulationActivity", "(I)V"); - s_disk_cache_load_progress = - env->GetStaticMethodID(s_disk_cache_progress_class, "loadProgress", "(III)V"); - s_on_emulation_started = - env->GetStaticMethodID(s_native_library_class, "onEmulationStarted", "()V"); - s_on_emulation_stopped = - env->GetStaticMethodID(s_native_library_class, "onEmulationStopped", "(I)V"); - s_on_program_changed = - env->GetStaticMethodID(s_native_library_class, "onProgramChanged", "(I)V"); - - const jclass game_class = env->FindClass("org/yuzu/yuzu_emu/model/Game"); - s_game_class = reinterpret_cast<jclass>(env->NewGlobalRef(game_class)); - s_game_constructor = env->GetMethodID(game_class, "<init>", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/" - "String;Ljava/lang/String;Ljava/lang/String;Z)V"); - s_game_title_field = env->GetFieldID(game_class, "title", "Ljava/lang/String;"); - s_game_path_field = env->GetFieldID(game_class, "path", "Ljava/lang/String;"); - s_game_program_id_field = env->GetFieldID(game_class, "programId", "Ljava/lang/String;"); - s_game_developer_field = env->GetFieldID(game_class, "developer", "Ljava/lang/String;"); - s_game_version_field = env->GetFieldID(game_class, "version", "Ljava/lang/String;"); - s_game_is_homebrew_field = env->GetFieldID(game_class, "isHomebrew", "Z"); - env->DeleteLocalRef(game_class); - - const jclass string_class = env->FindClass("java/lang/String"); - s_string_class = reinterpret_cast<jclass>(env->NewGlobalRef(string_class)); - env->DeleteLocalRef(string_class); - - const jclass pair_class = env->FindClass("kotlin/Pair"); - s_pair_class = reinterpret_cast<jclass>(env->NewGlobalRef(pair_class)); - s_pair_constructor = - env->GetMethodID(pair_class, "<init>", "(Ljava/lang/Object;Ljava/lang/Object;)V"); - s_pair_first_field = env->GetFieldID(pair_class, "first", "Ljava/lang/Object;"); - s_pair_second_field = env->GetFieldID(pair_class, "second", "Ljava/lang/Object;"); - env->DeleteLocalRef(pair_class); - - const jclass overlay_control_data_class = - env->FindClass("org/yuzu/yuzu_emu/overlay/model/OverlayControlData"); - s_overlay_control_data_class = - reinterpret_cast<jclass>(env->NewGlobalRef(overlay_control_data_class)); - s_overlay_control_data_constructor = - env->GetMethodID(overlay_control_data_class, "<init>", - "(Ljava/lang/String;ZLkotlin/Pair;Lkotlin/Pair;Lkotlin/Pair;)V"); - s_overlay_control_data_id_field = - env->GetFieldID(overlay_control_data_class, "id", "Ljava/lang/String;"); - s_overlay_control_data_enabled_field = - env->GetFieldID(overlay_control_data_class, "enabled", "Z"); - s_overlay_control_data_landscape_position_field = - env->GetFieldID(overlay_control_data_class, "landscapePosition", "Lkotlin/Pair;"); - s_overlay_control_data_portrait_position_field = - env->GetFieldID(overlay_control_data_class, "portraitPosition", "Lkotlin/Pair;"); - s_overlay_control_data_foldable_position_field = - env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;"); - env->DeleteLocalRef(overlay_control_data_class); - - const jclass patch_class = env->FindClass("org/yuzu/yuzu_emu/model/Patch"); - s_patch_class = reinterpret_cast<jclass>(env->NewGlobalRef(patch_class)); - s_patch_constructor = env->GetMethodID( - patch_class, "<init>", - "(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V"); - s_patch_enabled_field = env->GetFieldID(patch_class, "enabled", "Z"); - s_patch_name_field = env->GetFieldID(patch_class, "name", "Ljava/lang/String;"); - s_patch_version_field = env->GetFieldID(patch_class, "version", "Ljava/lang/String;"); - s_patch_type_field = env->GetFieldID(patch_class, "type", "I"); - s_patch_program_id_field = env->GetFieldID(patch_class, "programId", "Ljava/lang/String;"); - s_patch_title_id_field = env->GetFieldID(patch_class, "titleId", "Ljava/lang/String;"); - env->DeleteLocalRef(patch_class); - - const jclass double_class = env->FindClass("java/lang/Double"); - s_double_class = reinterpret_cast<jclass>(env->NewGlobalRef(double_class)); - s_double_constructor = env->GetMethodID(double_class, "<init>", "(D)V"); - s_double_value_field = env->GetFieldID(double_class, "value", "D"); - env->DeleteLocalRef(double_class); - - const jclass int_class = env->FindClass("java/lang/Integer"); - s_integer_class = reinterpret_cast<jclass>(env->NewGlobalRef(int_class)); - s_integer_constructor = env->GetMethodID(int_class, "<init>", "(I)V"); - s_integer_value_field = env->GetFieldID(int_class, "value", "I"); - env->DeleteLocalRef(int_class); - - const jclass boolean_class = env->FindClass("java/lang/Boolean"); - s_boolean_class = reinterpret_cast<jclass>(env->NewGlobalRef(boolean_class)); - s_boolean_constructor = env->GetMethodID(boolean_class, "<init>", "(Z)V"); - s_boolean_value_field = env->GetFieldID(boolean_class, "value", "Z"); - env->DeleteLocalRef(boolean_class); - - // Initialize Android Storage - Common::FS::Android::RegisterCallbacks(env, s_native_library_class); - - // Initialize applets - SoftwareKeyboard::InitJNI(env); - - return JNI_VERSION; -} - -void JNI_OnUnload(JavaVM* vm, void* reserved) { - JNIEnv* env; - if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION) != JNI_OK) { - return; - } - - // UnInitialize Android Storage - Common::FS::Android::UnRegisterCallbacks(); - env->DeleteGlobalRef(s_native_library_class); - env->DeleteGlobalRef(s_disk_cache_progress_class); - env->DeleteGlobalRef(s_load_callback_stage_class); - env->DeleteGlobalRef(s_game_dir_class); - env->DeleteGlobalRef(s_game_class); - env->DeleteGlobalRef(s_string_class); - env->DeleteGlobalRef(s_pair_class); - env->DeleteGlobalRef(s_overlay_control_data_class); - env->DeleteGlobalRef(s_patch_class); - env->DeleteGlobalRef(s_double_class); - env->DeleteGlobalRef(s_integer_class); - env->DeleteGlobalRef(s_boolean_class); - - // UnInitialize applets - SoftwareKeyboard::CleanupJNI(env); -} - -#ifdef __cplusplus -} -#endif diff --git a/src/android/app/src/main/jni/id_cache.h b/src/android/app/src/main/jni/id_cache.h deleted file mode 100644 index 00e48afc0..000000000 --- a/src/android/app/src/main/jni/id_cache.h +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-FileCopyrightText: 2023 yuzu Emulator Project -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <jni.h> - -#include "video_core/rasterizer_interface.h" - -namespace IDCache { - -JNIEnv* GetEnvForThread(); -jclass GetNativeLibraryClass(); -jclass GetDiskCacheProgressClass(); -jclass GetDiskCacheLoadCallbackStageClass(); -jclass GetGameDirClass(); -jmethodID GetGameDirConstructor(); -jmethodID GetExitEmulationActivity(); -jmethodID GetDiskCacheLoadProgress(); -jmethodID GetOnEmulationStarted(); -jmethodID GetOnEmulationStopped(); -jmethodID GetOnProgramChanged(); - -jclass GetGameClass(); -jmethodID GetGameConstructor(); -jfieldID GetGameTitleField(); -jfieldID GetGamePathField(); -jfieldID GetGameProgramIdField(); -jfieldID GetGameDeveloperField(); -jfieldID GetGameVersionField(); -jfieldID GetGameIsHomebrewField(); - -jclass GetStringClass(); -jclass GetPairClass(); -jmethodID GetPairConstructor(); -jfieldID GetPairFirstField(); -jfieldID GetPairSecondField(); - -jclass GetOverlayControlDataClass(); -jmethodID GetOverlayControlDataConstructor(); -jfieldID GetOverlayControlDataIdField(); -jfieldID GetOverlayControlDataEnabledField(); -jfieldID GetOverlayControlDataLandscapePositionField(); -jfieldID GetOverlayControlDataPortraitPositionField(); -jfieldID GetOverlayControlDataFoldablePositionField(); - -jclass GetPatchClass(); -jmethodID GetPatchConstructor(); -jfieldID GetPatchEnabledField(); -jfieldID GetPatchNameField(); -jfieldID GetPatchVersionField(); -jfieldID GetPatchTypeField(); -jfieldID GetPatchProgramIdField(); -jfieldID GetPatchTitleIdField(); - -jclass GetDoubleClass(); -jmethodID GetDoubleConstructor(); -jfieldID GetDoubleValueField(); - -jclass GetIntegerClass(); -jmethodID GetIntegerConstructor(); -jfieldID GetIntegerValueField(); - -jclass GetBooleanClass(); -jmethodID GetBooleanConstructor(); -jfieldID GetBooleanValueField(); - -} // namespace IDCache diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 654510129..4acc60956 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -20,6 +20,8 @@ #include <frontend_common/content_manager.h> #include <jni.h> +#include "common/android/android_common.h" +#include "common/android/id_cache.h" #include "common/detached_tasks.h" #include "common/dynamic_library.h" #include "common/fs/path_util.h" @@ -57,8 +59,6 @@ #include "hid_core/frontend/emulated_controller.h" #include "hid_core/hid_core.h" #include "hid_core/hid_types.h" -#include "jni/android_common/android_common.h" -#include "jni/id_cache.h" #include "jni/native.h" #include "video_core/renderer_base.h" #include "video_core/renderer_vulkan/renderer_vulkan.h" @@ -228,7 +228,7 @@ Core::SystemResultStatus EmulationSession::InitializeEmulation(const std::string std::make_unique<EmuWindow_Android>(&m_input_subsystem, m_native_window, m_vulkan_library); // Initialize system. - jauto android_keyboard = std::make_unique<SoftwareKeyboard::AndroidKeyboard>(); + jauto android_keyboard = std::make_unique<Common::Android::SoftwareKeyboard::AndroidKeyboard>(); m_software_keyboard = android_keyboard.get(); m_system.SetShuttingDown(false); m_system.ApplySettings(); @@ -411,37 +411,39 @@ void EmulationSession::OnGamepadDisconnectEvent([[maybe_unused]] int index) { controller->Disconnect(); } -SoftwareKeyboard::AndroidKeyboard* EmulationSession::SoftwareKeyboard() { +Common::Android::SoftwareKeyboard::AndroidKeyboard* EmulationSession::SoftwareKeyboard() { return m_software_keyboard; } void EmulationSession::LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max) { - JNIEnv* env = IDCache::GetEnvForThread(); - env->CallStaticVoidMethod(IDCache::GetDiskCacheProgressClass(), - IDCache::GetDiskCacheLoadProgress(), static_cast<jint>(stage), + JNIEnv* env = Common::Android::GetEnvForThread(); + env->CallStaticVoidMethod(Common::Android::GetDiskCacheProgressClass(), + Common::Android::GetDiskCacheLoadProgress(), static_cast<jint>(stage), static_cast<jint>(progress), static_cast<jint>(max)); } void EmulationSession::OnEmulationStarted() { - JNIEnv* env = IDCache::GetEnvForThread(); - env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnEmulationStarted()); + JNIEnv* env = Common::Android::GetEnvForThread(); + env->CallStaticVoidMethod(Common::Android::GetNativeLibraryClass(), + Common::Android::GetOnEmulationStarted()); } void EmulationSession::OnEmulationStopped(Core::SystemResultStatus result) { - JNIEnv* env = IDCache::GetEnvForThread(); - env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnEmulationStopped(), - static_cast<jint>(result)); + JNIEnv* env = Common::Android::GetEnvForThread(); + env->CallStaticVoidMethod(Common::Android::GetNativeLibraryClass(), + Common::Android::GetOnEmulationStopped(), static_cast<jint>(result)); } void EmulationSession::ChangeProgram(std::size_t program_index) { - JNIEnv* env = IDCache::GetEnvForThread(); - env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnProgramChanged(), + JNIEnv* env = Common::Android::GetEnvForThread(); + env->CallStaticVoidMethod(Common::Android::GetNativeLibraryClass(), + Common::Android::GetOnProgramChanged(), static_cast<jint>(program_index)); } u64 EmulationSession::GetProgramId(JNIEnv* env, jstring jprogramId) { - auto program_id_string = GetJString(env, jprogramId); + auto program_id_string = Common::Android::GetJString(env, jprogramId); try { return std::stoull(program_id_string); } catch (...) { @@ -491,7 +493,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_surfaceDestroyed(JNIEnv* env, jobject void Java_org_yuzu_yuzu_1emu_NativeLibrary_setAppDirectory(JNIEnv* env, jobject instance, [[maybe_unused]] jstring j_directory) { - Common::FS::SetAppDirectory(GetJString(env, j_directory)); + Common::FS::SetAppDirectory(Common::Android::GetJString(env, j_directory)); } int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject instance, @@ -501,21 +503,22 @@ int Java_org_yuzu_yuzu_1emu_NativeLibrary_installFileToNand(JNIEnv* env, jobject jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) { auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod, - ToJDouble(env, max), ToJDouble(env, progress)); - return GetJBoolean(env, jwasCancelled); + Common::Android::ToJDouble(env, max), + Common::Android::ToJDouble(env, progress)); + return Common::Android::GetJBoolean(env, jwasCancelled); }; return static_cast<int>( ContentManager::InstallNSP(EmulationSession::GetInstance().System(), *EmulationSession::GetInstance().System().GetFilesystem(), - GetJString(env, j_file), callback)); + Common::Android::GetJString(env, j_file), callback)); } jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_doesUpdateMatchProgram(JNIEnv* env, jobject jobj, jstring jprogramId, jstring jupdatePath) { u64 program_id = EmulationSession::GetProgramId(env, jprogramId); - std::string updatePath = GetJString(env, jupdatePath); + std::string updatePath = Common::Android::GetJString(env, jupdatePath); std::shared_ptr<FileSys::NSP> nsp = std::make_shared<FileSys::NSP>( EmulationSession::GetInstance().System().GetFilesystem()->OpenFile( updatePath, FileSys::OpenMode::Read)); @@ -538,8 +541,10 @@ void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initializeGpuDriver(JNIEnv* e jstring custom_driver_name, jstring file_redirect_dir) { EmulationSession::GetInstance().InitializeGpuDriver( - GetJString(env, hook_lib_dir), GetJString(env, custom_driver_dir), - GetJString(env, custom_driver_name), GetJString(env, file_redirect_dir)); + Common::Android::GetJString(env, hook_lib_dir), + Common::Android::GetJString(env, custom_driver_dir), + Common::Android::GetJString(env, custom_driver_name), + Common::Android::GetJString(env, file_redirect_dir)); } [[maybe_unused]] static bool CheckKgslPresent() { @@ -566,7 +571,7 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo( JNIEnv* env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) { const char* file_redirect_dir_{}; int featureFlags{}; - std::string hook_lib_dir = GetJString(env, j_hook_lib_dir); + std::string hook_lib_dir = Common::Android::GetJString(env, j_hook_lib_dir); auto handle = adrenotools_open_libvulkan(RTLD_NOW, featureFlags, nullptr, hook_lib_dir.c_str(), nullptr, nullptr, file_redirect_dir_, nullptr); auto driver_library = std::make_shared<Common::DynamicLibrary>(handle); @@ -587,9 +592,10 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo( fmt::format("{}.{}.{}", VK_API_VERSION_MAJOR(driver_version), VK_API_VERSION_MINOR(driver_version), VK_API_VERSION_PATCH(driver_version)); - jobjectArray j_driver_info = - env->NewObjectArray(2, IDCache::GetStringClass(), ToJString(env, version_string)); - env->SetObjectArrayElement(j_driver_info, 1, ToJString(env, device.GetDriverName())); + jobjectArray j_driver_info = env->NewObjectArray( + 2, Common::Android::GetStringClass(), Common::Android::ToJString(env, version_string)); + env->SetObjectArrayElement(j_driver_info, 1, + Common::Android::ToJString(env, device.GetDriverName())); return j_driver_info; } @@ -742,15 +748,15 @@ jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPerfStats(JNIEnv* env, jcl jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getCpuBackend(JNIEnv* env, jclass clazz) { if (Settings::IsNceEnabled()) { - return ToJString(env, "NCE"); + return Common::Android::ToJString(env, "NCE"); } - return ToJString(env, "JIT"); + return Common::Android::ToJString(env, "JIT"); } jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getGpuDriver(JNIEnv* env, jobject jobj) { - return ToJString(env, - EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor()); + return Common::Android::ToJString( + env, EmulationSession::GetInstance().System().GPU().Renderer().GetDeviceVendor()); } void Java_org_yuzu_yuzu_1emu_NativeLibrary_applySettings(JNIEnv* env, jobject jobj) { @@ -764,13 +770,14 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_logSettings(JNIEnv* env, jobject jobj void Java_org_yuzu_yuzu_1emu_NativeLibrary_run(JNIEnv* env, jobject jobj, jstring j_path, jint j_program_index, jboolean j_frontend_initiated) { - const std::string path = GetJString(env, j_path); + const std::string path = Common::Android::GetJString(env, j_path); const Core::SystemResultStatus result{ RunEmulation(path, j_program_index, j_frontend_initiated)}; if (result != Core::SystemResultStatus::Success) { - env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), - IDCache::GetExitEmulationActivity(), static_cast<int>(result)); + env->CallStaticVoidMethod(Common::Android::GetNativeLibraryClass(), + Common::Android::GetExitEmulationActivity(), + static_cast<int>(result)); } } @@ -781,7 +788,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_logDeviceInfo(JNIEnv* env, jclass cla void Java_org_yuzu_yuzu_1emu_NativeLibrary_submitInlineKeyboardText(JNIEnv* env, jclass clazz, jstring j_text) { - const std::u16string input = Common::UTF8ToUTF16(GetJString(env, j_text)); + const std::u16string input = Common::UTF8ToUTF16(Common::Android::GetJString(env, j_text)); EmulationSession::GetInstance().SoftwareKeyboard()->SubmitInlineKeyboardText(input); } @@ -815,16 +822,16 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getAppletLaunchPath(JNIEnv* env, j auto bis_system = EmulationSession::GetInstance().System().GetFileSystemController().GetSystemNANDContents(); if (!bis_system) { - return ToJString(env, ""); + return Common::Android::ToJString(env, ""); } auto applet_nca = bis_system->GetEntry(static_cast<u64>(jid), FileSys::ContentRecordType::Program); if (!applet_nca) { - return ToJString(env, ""); + return Common::Android::ToJString(env, ""); } - return ToJString(env, applet_nca->GetFullPath()); + return Common::Android::ToJString(env, applet_nca->GetFullPath()); } void Java_org_yuzu_yuzu_1emu_NativeLibrary_setCurrentAppletId(JNIEnv* env, jclass clazz, @@ -857,7 +864,7 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_isFirmwareAvailable(JNIEnv* env, jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env, jobject jobj, jstring jpath, jstring jprogramId) { - const auto path = GetJString(env, jpath); + const auto path = Common::Android::GetJString(env, jpath); const auto vFile = Core::GetGameFileFromPath(EmulationSession::GetInstance().System().GetFilesystem(), path); if (vFile == nullptr) { @@ -875,14 +882,15 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env auto patches = pm.GetPatches(update_raw); jobjectArray jpatchArray = - env->NewObjectArray(patches.size(), IDCache::GetPatchClass(), nullptr); + env->NewObjectArray(patches.size(), Common::Android::GetPatchClass(), nullptr); int i = 0; for (const auto& patch : patches) { jobject jpatch = env->NewObject( - IDCache::GetPatchClass(), IDCache::GetPatchConstructor(), patch.enabled, - ToJString(env, patch.name), ToJString(env, patch.version), - static_cast<jint>(patch.type), ToJString(env, std::to_string(patch.program_id)), - ToJString(env, std::to_string(patch.title_id))); + Common::Android::GetPatchClass(), Common::Android::GetPatchConstructor(), patch.enabled, + Common::Android::ToJString(env, patch.name), + Common::Android::ToJString(env, patch.version), static_cast<jint>(patch.type), + Common::Android::ToJString(env, std::to_string(patch.program_id)), + Common::Android::ToJString(env, std::to_string(patch.title_id))); env->SetObjectArrayElement(jpatchArray, i, jpatch); ++i; } @@ -906,7 +914,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_removeMod(JNIEnv* env, jobject jobj, jstring jname) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); ContentManager::RemoveMod(EmulationSession::GetInstance().System().GetFileSystemController(), - program_id, GetJString(env, jname)); + program_id, Common::Android::GetJString(env, jname)); } jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyInstalledContents(JNIEnv* env, @@ -917,17 +925,18 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyInstalledContents(JNIEn jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) { auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod, - ToJDouble(env, max), ToJDouble(env, progress)); - return GetJBoolean(env, jwasCancelled); + Common::Android::ToJDouble(env, max), + Common::Android::ToJDouble(env, progress)); + return Common::Android::GetJBoolean(env, jwasCancelled); }; auto& session = EmulationSession::GetInstance(); std::vector<std::string> result = ContentManager::VerifyInstalledContents( session.System(), *session.GetContentProvider(), callback); - jobjectArray jresult = - env->NewObjectArray(result.size(), IDCache::GetStringClass(), ToJString(env, "")); + jobjectArray jresult = env->NewObjectArray(result.size(), Common::Android::GetStringClass(), + Common::Android::ToJString(env, "")); for (size_t i = 0; i < result.size(); ++i) { - env->SetObjectArrayElement(jresult, i, ToJString(env, result[i])); + env->SetObjectArrayElement(jresult, i, Common::Android::ToJString(env, result[i])); } return jresult; } @@ -939,19 +948,20 @@ jint Java_org_yuzu_yuzu_1emu_NativeLibrary_verifyGameContents(JNIEnv* env, jobje jlambdaClass, "invoke", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); const auto callback = [env, jcallback, jlambdaInvokeMethod](size_t max, size_t progress) { auto jwasCancelled = env->CallObjectMethod(jcallback, jlambdaInvokeMethod, - ToJDouble(env, max), ToJDouble(env, progress)); - return GetJBoolean(env, jwasCancelled); + Common::Android::ToJDouble(env, max), + Common::Android::ToJDouble(env, progress)); + return Common::Android::GetJBoolean(env, jwasCancelled); }; auto& session = EmulationSession::GetInstance(); - return static_cast<jint>( - ContentManager::VerifyGameContents(session.System(), GetJString(env, jpath), callback)); + return static_cast<jint>(ContentManager::VerifyGameContents( + session.System(), Common::Android::GetJString(env, jpath), callback)); } jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject jobj, jstring jprogramId) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); if (program_id == 0) { - return ToJString(env, ""); + return Common::Android::ToJString(env, ""); } auto& system = EmulationSession::GetInstance().System(); @@ -968,7 +978,7 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getSavePath(JNIEnv* env, jobject j const auto user_save_data_path = FileSys::SaveDataFactory::GetFullPath( {}, vfsNandDir, FileSys::SaveDataSpaceId::NandUser, FileSys::SaveDataType::SaveData, program_id, user_id->AsU128(), 0); - return ToJString(env, user_save_data_path); + return Common::Android::ToJString(env, user_save_data_path); } jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIEnv* env, @@ -981,12 +991,13 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getDefaultProfileSaveDataRoot(JNIE const auto user_save_data_root = FileSys::SaveDataFactory::GetUserGameSaveDataRoot(user_id->AsU128(), jfuture); - return ToJString(env, user_save_data_root); + return Common::Android::ToJString(env, user_save_data_root); } void Java_org_yuzu_yuzu_1emu_NativeLibrary_addFileToFilesystemProvider(JNIEnv* env, jobject jobj, jstring jpath) { - EmulationSession::GetInstance().ConfigureFilesystemProvider(GetJString(env, jpath)); + EmulationSession::GetInstance().ConfigureFilesystemProvider( + Common::Android::GetJString(env, jpath)); } void Java_org_yuzu_yuzu_1emu_NativeLibrary_clearFilesystemProvider(JNIEnv* env, jobject jobj) { diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h index e49d4e015..47936e305 100644 --- a/src/android/app/src/main/jni/native.h +++ b/src/android/app/src/main/jni/native.h @@ -2,13 +2,13 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include <android/native_window_jni.h> +#include "common/android/applets/software_keyboard.h" #include "common/detached_tasks.h" #include "core/core.h" #include "core/file_sys/registered_cache.h" #include "core/hle/service/acc/profile_manager.h" #include "core/perf_stats.h" #include "frontend_common/content_manager.h" -#include "jni/applets/software_keyboard.h" #include "jni/emu_window/emu_window.h" #include "video_core/rasterizer_interface.h" @@ -54,7 +54,7 @@ public: void SetDeviceType([[maybe_unused]] int index, int type); void OnGamepadConnectEvent([[maybe_unused]] int index); void OnGamepadDisconnectEvent([[maybe_unused]] int index); - SoftwareKeyboard::AndroidKeyboard* SoftwareKeyboard(); + Common::Android::SoftwareKeyboard::AndroidKeyboard* SoftwareKeyboard(); static void OnEmulationStarted(); @@ -79,7 +79,7 @@ private: Core::SystemResultStatus m_load_result{Core::SystemResultStatus::ErrorNotInitialized}; std::atomic<bool> m_is_running = false; std::atomic<bool> m_is_paused = false; - SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; + Common::Android::SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider; int m_applet_id{1}; diff --git a/src/android/app/src/main/jni/native_config.cpp b/src/android/app/src/main/jni/native_config.cpp index c6c3343dc..8ae10fbc7 100644 --- a/src/android/app/src/main/jni/native_config.cpp +++ b/src/android/app/src/main/jni/native_config.cpp @@ -8,11 +8,11 @@ #include "android_config.h" #include "android_settings.h" +#include "common/android/android_common.h" +#include "common/android/id_cache.h" #include "common/logging/log.h" #include "common/settings.h" #include "frontend_common/config.h" -#include "jni/android_common/android_common.h" -#include "jni/id_cache.h" #include "native.h" std::unique_ptr<AndroidConfig> global_config; @@ -20,7 +20,7 @@ std::unique_ptr<AndroidConfig> per_game_config; template <typename T> Settings::Setting<T>* getSetting(JNIEnv* env, jstring jkey) { - auto key = GetJString(env, jkey); + auto key = Common::Android::GetJString(env, jkey); auto basic_setting = Settings::values.linkage.by_key[key]; if (basic_setting != 0) { return static_cast<Settings::Setting<T>*>(basic_setting); @@ -55,7 +55,7 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_initializePerGameConfig(JNIEnv* jstring jprogramId, jstring jfileName) { auto program_id = EmulationSession::GetProgramId(env, jprogramId); - auto file_name = GetJString(env, jfileName); + auto file_name = Common::Android::GetJString(env, jfileName); const auto config_file_name = program_id == 0 ? file_name : fmt::format("{:016X}", program_id); per_game_config = std::make_unique<AndroidConfig>(config_file_name, Config::ConfigType::PerGameConfig); @@ -186,9 +186,9 @@ jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getString(JNIEnv* env, jobjec jboolean needGlobal) { auto setting = getSetting<std::string>(env, jkey); if (setting == nullptr) { - return ToJString(env, ""); + return Common::Android::ToJString(env, ""); } - return ToJString(env, setting->GetValue(static_cast<bool>(needGlobal))); + return Common::Android::ToJString(env, setting->GetValue(static_cast<bool>(needGlobal))); } void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject obj, jstring jkey, @@ -198,7 +198,7 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setString(JNIEnv* env, jobject o return; } - setting->SetValue(GetJString(env, value)); + setting->SetValue(Common::Android::GetJString(env, value)); } jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsRuntimeModifiable(JNIEnv* env, jobject obj, @@ -214,13 +214,13 @@ jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getPairedSettingKey(JNIEnv* e jstring jkey) { auto setting = getSetting<std::string>(env, jkey); if (setting == nullptr) { - return ToJString(env, ""); + return Common::Android::ToJString(env, ""); } if (setting->PairedSetting() == nullptr) { - return ToJString(env, ""); + return Common::Android::ToJString(env, ""); } - return ToJString(env, setting->PairedSetting()->GetLabel()); + return Common::Android::ToJString(env, setting->PairedSetting()->GetLabel()); } jboolean Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getIsSwitchable(JNIEnv* env, jobject obj, @@ -262,21 +262,21 @@ jstring Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getDefaultToString(JNIEnv* en jstring jkey) { auto setting = getSetting<std::string>(env, jkey); if (setting != nullptr) { - return ToJString(env, setting->DefaultToString()); + return Common::Android::ToJString(env, setting->DefaultToString()); } - return ToJString(env, ""); + return Common::Android::ToJString(env, ""); } jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getGameDirs(JNIEnv* env, jobject obj) { - jclass gameDirClass = IDCache::GetGameDirClass(); - jmethodID gameDirConstructor = IDCache::GetGameDirConstructor(); + jclass gameDirClass = Common::Android::GetGameDirClass(); + jmethodID gameDirConstructor = Common::Android::GetGameDirConstructor(); jobjectArray jgameDirArray = env->NewObjectArray(AndroidSettings::values.game_dirs.size(), gameDirClass, nullptr); for (size_t i = 0; i < AndroidSettings::values.game_dirs.size(); ++i) { - jobject jgameDir = - env->NewObject(gameDirClass, gameDirConstructor, - ToJString(env, AndroidSettings::values.game_dirs[i].path), - static_cast<jboolean>(AndroidSettings::values.game_dirs[i].deep_scan)); + jobject jgameDir = env->NewObject( + gameDirClass, gameDirConstructor, + Common::Android::ToJString(env, AndroidSettings::values.game_dirs[i].path), + static_cast<jboolean>(AndroidSettings::values.game_dirs[i].deep_scan)); env->SetObjectArrayElement(jgameDirArray, i, jgameDir); } return jgameDirArray; @@ -292,14 +292,14 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject } jobject dir = env->GetObjectArrayElement(gameDirs, 0); - jclass gameDirClass = IDCache::GetGameDirClass(); + jclass gameDirClass = Common::Android::GetGameDirClass(); jfieldID uriStringField = env->GetFieldID(gameDirClass, "uriString", "Ljava/lang/String;"); jfieldID deepScanBooleanField = env->GetFieldID(gameDirClass, "deepScan", "Z"); for (int i = 0; i < size; ++i) { dir = env->GetObjectArrayElement(gameDirs, i); jstring juriString = static_cast<jstring>(env->GetObjectField(dir, uriStringField)); jboolean jdeepScanBoolean = env->GetBooleanField(dir, deepScanBooleanField); - std::string uriString = GetJString(env, juriString); + std::string uriString = Common::Android::GetJString(env, juriString); AndroidSettings::values.game_dirs.push_back( AndroidSettings::GameDir{uriString, static_cast<bool>(jdeepScanBoolean)}); } @@ -307,13 +307,13 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setGameDirs(JNIEnv* env, jobject void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_addGameDir(JNIEnv* env, jobject obj, jobject gameDir) { - jclass gameDirClass = IDCache::GetGameDirClass(); + jclass gameDirClass = Common::Android::GetGameDirClass(); jfieldID uriStringField = env->GetFieldID(gameDirClass, "uriString", "Ljava/lang/String;"); jfieldID deepScanBooleanField = env->GetFieldID(gameDirClass, "deepScan", "Z"); jstring juriString = static_cast<jstring>(env->GetObjectField(gameDir, uriStringField)); jboolean jdeepScanBoolean = env->GetBooleanField(gameDir, deepScanBooleanField); - std::string uriString = GetJString(env, juriString); + std::string uriString = Common::Android::GetJString(env, juriString); AndroidSettings::values.game_dirs.push_back( AndroidSettings::GameDir{uriString, static_cast<bool>(jdeepScanBoolean)}); } @@ -323,9 +323,11 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getDisabledAddons(JNIEnv auto program_id = EmulationSession::GetProgramId(env, jprogramId); auto& disabledAddons = Settings::values.disabled_addons[program_id]; jobjectArray jdisabledAddonsArray = - env->NewObjectArray(disabledAddons.size(), IDCache::GetStringClass(), ToJString(env, "")); + env->NewObjectArray(disabledAddons.size(), Common::Android::GetStringClass(), + Common::Android::ToJString(env, "")); for (size_t i = 0; i < disabledAddons.size(); ++i) { - env->SetObjectArrayElement(jdisabledAddonsArray, i, ToJString(env, disabledAddons[i])); + env->SetObjectArrayElement(jdisabledAddonsArray, i, + Common::Android::ToJString(env, disabledAddons[i])); } return jdisabledAddonsArray; } @@ -339,7 +341,7 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setDisabledAddons(JNIEnv* env, j const int size = env->GetArrayLength(jdisabledAddons); for (int i = 0; i < size; ++i) { auto jaddon = static_cast<jstring>(env->GetObjectArrayElement(jdisabledAddons, i)); - disabled_addons.push_back(GetJString(env, jaddon)); + disabled_addons.push_back(Common::Android::GetJString(env, jaddon)); } Settings::values.disabled_addons[program_id] = disabled_addons; } @@ -348,26 +350,27 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getOverlayControlData(JN jobject obj) { jobjectArray joverlayControlDataArray = env->NewObjectArray(AndroidSettings::values.overlay_control_data.size(), - IDCache::GetOverlayControlDataClass(), nullptr); + Common::Android::GetOverlayControlDataClass(), nullptr); for (size_t i = 0; i < AndroidSettings::values.overlay_control_data.size(); ++i) { const auto& control_data = AndroidSettings::values.overlay_control_data[i]; jobject jlandscapePosition = - env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(), - ToJDouble(env, control_data.landscape_position.first), - ToJDouble(env, control_data.landscape_position.second)); + env->NewObject(Common::Android::GetPairClass(), Common::Android::GetPairConstructor(), + Common::Android::ToJDouble(env, control_data.landscape_position.first), + Common::Android::ToJDouble(env, control_data.landscape_position.second)); jobject jportraitPosition = - env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(), - ToJDouble(env, control_data.portrait_position.first), - ToJDouble(env, control_data.portrait_position.second)); + env->NewObject(Common::Android::GetPairClass(), Common::Android::GetPairConstructor(), + Common::Android::ToJDouble(env, control_data.portrait_position.first), + Common::Android::ToJDouble(env, control_data.portrait_position.second)); jobject jfoldablePosition = - env->NewObject(IDCache::GetPairClass(), IDCache::GetPairConstructor(), - ToJDouble(env, control_data.foldable_position.first), - ToJDouble(env, control_data.foldable_position.second)); - - jobject jcontrolData = env->NewObject( - IDCache::GetOverlayControlDataClass(), IDCache::GetOverlayControlDataConstructor(), - ToJString(env, control_data.id), control_data.enabled, jlandscapePosition, - jportraitPosition, jfoldablePosition); + env->NewObject(Common::Android::GetPairClass(), Common::Android::GetPairConstructor(), + Common::Android::ToJDouble(env, control_data.foldable_position.first), + Common::Android::ToJDouble(env, control_data.foldable_position.second)); + + jobject jcontrolData = + env->NewObject(Common::Android::GetOverlayControlDataClass(), + Common::Android::GetOverlayControlDataConstructor(), + Common::Android::ToJString(env, control_data.id), control_data.enabled, + jlandscapePosition, jportraitPosition, jfoldablePosition); env->SetObjectArrayElement(joverlayControlDataArray, i, jcontrolData); } return joverlayControlDataArray; @@ -384,33 +387,41 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setOverlayControlData( for (int i = 0; i < size; ++i) { jobject joverlayControlData = env->GetObjectArrayElement(joverlayControlDataArray, i); - jstring jidString = static_cast<jstring>( - env->GetObjectField(joverlayControlData, IDCache::GetOverlayControlDataIdField())); + jstring jidString = static_cast<jstring>(env->GetObjectField( + joverlayControlData, Common::Android::GetOverlayControlDataIdField())); bool enabled = static_cast<bool>(env->GetBooleanField( - joverlayControlData, IDCache::GetOverlayControlDataEnabledField())); + joverlayControlData, Common::Android::GetOverlayControlDataEnabledField())); jobject jlandscapePosition = env->GetObjectField( - joverlayControlData, IDCache::GetOverlayControlDataLandscapePositionField()); + joverlayControlData, Common::Android::GetOverlayControlDataLandscapePositionField()); std::pair<double, double> landscape_position = std::make_pair( - GetJDouble(env, env->GetObjectField(jlandscapePosition, IDCache::GetPairFirstField())), - GetJDouble(env, - env->GetObjectField(jlandscapePosition, IDCache::GetPairSecondField()))); + Common::Android::GetJDouble( + env, env->GetObjectField(jlandscapePosition, Common::Android::GetPairFirstField())), + Common::Android::GetJDouble( + env, + env->GetObjectField(jlandscapePosition, Common::Android::GetPairSecondField()))); jobject jportraitPosition = env->GetObjectField( - joverlayControlData, IDCache::GetOverlayControlDataPortraitPositionField()); + joverlayControlData, Common::Android::GetOverlayControlDataPortraitPositionField()); std::pair<double, double> portrait_position = std::make_pair( - GetJDouble(env, env->GetObjectField(jportraitPosition, IDCache::GetPairFirstField())), - GetJDouble(env, env->GetObjectField(jportraitPosition, IDCache::GetPairSecondField()))); + Common::Android::GetJDouble( + env, env->GetObjectField(jportraitPosition, Common::Android::GetPairFirstField())), + Common::Android::GetJDouble( + env, + env->GetObjectField(jportraitPosition, Common::Android::GetPairSecondField()))); jobject jfoldablePosition = env->GetObjectField( - joverlayControlData, IDCache::GetOverlayControlDataFoldablePositionField()); + joverlayControlData, Common::Android::GetOverlayControlDataFoldablePositionField()); std::pair<double, double> foldable_position = std::make_pair( - GetJDouble(env, env->GetObjectField(jfoldablePosition, IDCache::GetPairFirstField())), - GetJDouble(env, env->GetObjectField(jfoldablePosition, IDCache::GetPairSecondField()))); + Common::Android::GetJDouble( + env, env->GetObjectField(jfoldablePosition, Common::Android::GetPairFirstField())), + Common::Android::GetJDouble( + env, + env->GetObjectField(jfoldablePosition, Common::Android::GetPairSecondField()))); AndroidSettings::values.overlay_control_data.push_back(AndroidSettings::OverlayControlData{ - GetJString(env, jidString), enabled, landscape_position, portrait_position, - foldable_position}); + Common::Android::GetJString(env, jidString), enabled, landscape_position, + portrait_position, foldable_position}); } } diff --git a/src/android/app/src/main/jni/native_log.cpp b/src/android/app/src/main/jni/native_log.cpp index 33d691dc8..95dd1f057 100644 --- a/src/android/app/src/main/jni/native_log.cpp +++ b/src/android/app/src/main/jni/native_log.cpp @@ -1,31 +1,30 @@ // SPDX-FileCopyrightText: 2023 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include <common/android/android_common.h> #include <common/logging/log.h> #include <jni.h> -#include "android_common/android_common.h" - extern "C" { void Java_org_yuzu_yuzu_1emu_utils_Log_debug(JNIEnv* env, jobject obj, jstring jmessage) { - LOG_DEBUG(Frontend, "{}", GetJString(env, jmessage)); + LOG_DEBUG(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } void Java_org_yuzu_yuzu_1emu_utils_Log_warning(JNIEnv* env, jobject obj, jstring jmessage) { - LOG_WARNING(Frontend, "{}", GetJString(env, jmessage)); + LOG_WARNING(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } void Java_org_yuzu_yuzu_1emu_utils_Log_info(JNIEnv* env, jobject obj, jstring jmessage) { - LOG_INFO(Frontend, "{}", GetJString(env, jmessage)); + LOG_INFO(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } void Java_org_yuzu_yuzu_1emu_utils_Log_error(JNIEnv* env, jobject obj, jstring jmessage) { - LOG_ERROR(Frontend, "{}", GetJString(env, jmessage)); + LOG_ERROR(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } void Java_org_yuzu_yuzu_1emu_utils_Log_critical(JNIEnv* env, jobject obj, jstring jmessage) { - LOG_CRITICAL(Frontend, "{}", GetJString(env, jmessage)); + LOG_CRITICAL(Frontend, "{}", Common::Android::GetJString(env, jmessage)); } } // extern "C" |