From aa4e494c08075f5d048e8e3d6e0f7426d88d0f0a Mon Sep 17 00:00:00 2001 From: crueter Date: Wed, 2 Sep 2026 00:29:58 +0200 Subject: [android] Replace Oboe audio with SDL3 audio (#4338) Supersedes #4335. Replaces the Oboe audio backend with SDL3, since we already support it. A few caveats: - SDL defines a JVM OnLoad method already, so we have to instead hijack NativeLibrary for id_cache initialization - This also means some internal fields in Double/Integer/Boolean (namely `value`) can't be accessed, so I switched those to methods for now. - SDL Java sources are pulled in from the CI package. - Since we can't use SDLActivity, `SDL.setupJNI()` handles everything Signed-off-by: crueter - [x] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions). - [x] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md) - [x] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability. ------------------- Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4338 Reviewed-by: Lizzie and Samuel Reviewed-by: MaranBr --- src/android/app/build.gradle.kts | 7 +++++++ src/android/app/proguard-rules.pro | 3 +++ src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt | 4 ++++ src/android/app/src/main/jni/CMakeLists.txt | 2 +- src/android/app/src/main/jni/native.cpp | 9 +++++++++ src/android/app/src/main/res/values-fa/strings.xml | 1 - src/android/app/src/main/res/values/arrays.xml | 4 ++-- src/android/app/src/main/res/values/strings.xml | 2 +- 8 files changed, 27 insertions(+), 5 deletions(-) (limited to 'src/android') diff --git a/src/android/app/build.gradle.kts b/src/android/app/build.gradle.kts index 0cef7e7196..3ae6d73994 100644 --- a/src/android/app/build.gradle.kts +++ b/src/android/app/build.gradle.kts @@ -272,6 +272,13 @@ android { resValue("string", "app_name_suffixed", "$currentName$suffix") resValue("string", "app_name", "Eden$suffix") } + + sourceSets { + named("main") { + java.srcDir("${edenDir}/externals/generated/sdl/java") + kotlin.srcDir("${edenDir}/externals/generated/sdl/java") + } + } } idea { diff --git a/src/android/app/proguard-rules.pro b/src/android/app/proguard-rules.pro index 691e08fd03..91f63bbb84 100644 --- a/src/android/app/proguard-rules.pro +++ b/src/android/app/proguard-rules.pro @@ -9,6 +9,9 @@ -keep class org.ini4j.spi.IniBuilder -keep class org.ini4j.spi.IniFormatter +-keep class org.libsdl.app.** { *; } +-keepclassmembers class org.libsdl.app.** { *; } + # Suppress warnings for R8 -dontwarn org.bouncycastle.jsse.BCSSLParameters -dontwarn org.bouncycastle.jsse.BCSSLSocket diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt index 4b46dd76a2..77222884c6 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/NativeLibrary.kt @@ -16,6 +16,7 @@ import android.widget.TextView import androidx.annotation.Keep import androidx.core.net.toUri import com.google.android.material.dialog.MaterialAlertDialogBuilder +import org.libsdl.app.SDL import java.lang.ref.WeakReference import org.yuzu.yuzu_emu.activities.EmulationActivity import org.yuzu.yuzu_emu.fragments.CoreErrorDialogFragment @@ -52,6 +53,8 @@ object NativeLibrary { init { try { System.loadLibrary("yuzu-android") + SDL.setupJNI() + initJvm() } catch (ex: UnsatisfiedLinkError) { error("[NativeLibrary] $ex") } @@ -367,6 +370,7 @@ object NativeLibrary { NetPlayManager.clearChat() } + external fun initJvm() external fun initMultiplayer() @Keep diff --git a/src/android/app/src/main/jni/CMakeLists.txt b/src/android/app/src/main/jni/CMakeLists.txt index 7013691765..86c05d7c0d 100644 --- a/src/android/app/src/main/jni/CMakeLists.txt +++ b/src/android/app/src/main/jni/CMakeLists.txt @@ -22,7 +22,7 @@ add_library(yuzu-android SHARED set_property(TARGET yuzu-android PROPERTY IMPORTED_LOCATION ${FFmpeg_LIBRARY_DIR}) target_link_libraries(yuzu-android PRIVATE audio_core common core input_common frontend_common video_core) -target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log) +target_link_libraries(yuzu-android PRIVATE android camera2ndk EGL glad jnigraphics log GLESv2) if (ARCHITECTURE_arm64) target_link_libraries(yuzu-android PRIVATE adrenotools) endif() diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 9fc550985a..423edc2c1b 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -1730,6 +1730,15 @@ jint Java_org_yuzu_yuzu_1emu_NativeLibrary_loadAmiibo(JNIEnv* env, jobject jobj, return static_cast(info); } +extern "C" JNIEXPORT void JNICALL +Java_org_yuzu_yuzu_1emu_NativeLibrary_initJvm(JNIEnv *env, jclass clazz) { + JavaVM *vm; + if (env->GetJavaVM(&vm) != JNI_OK) + return; + + Common::Android::Initialize(vm, env); +} + JNIEXPORT void JNICALL Java_org_yuzu_yuzu_1emu_NativeLibrary_initMultiplayer( JNIEnv* env, [[maybe_unused]] jobject obj) { diff --git a/src/android/app/src/main/res/values-fa/strings.xml b/src/android/app/src/main/res/values-fa/strings.xml index 98b94d166d..6b40d97f2a 100644 --- a/src/android/app/src/main/res/values-fa/strings.xml +++ b/src/android/app/src/main/res/values-fa/strings.xml @@ -800,7 +800,6 @@ تاریک - oboe cubeb diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index b1c0a98a61..931cf2bfa7 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -465,13 +465,13 @@ @string/auto - @string/oboe + @string/sdl3 @string/cubeb @string/string_null 0 - 4 + 2 1 3 diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 3f6d1889ff..55783f6e43 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -1240,7 +1240,7 @@ Dark - oboe + SDL3 cubeb -- cgit v1.2.3