A fully self-contained Android port of the Ryubing Nintendo Switch emulator (a maintained fork of Ryujinx).
This repository is a thin Android wrapper around an unmodified Ryubing checkout. Ryubing is included as a git submodule under upstream/ryubing so upstream changes can be pulled with minimal friction. Android-specific code lives entirely in this repo; upstream is only touched through a small, need-driven patch queue in patches/.
Kotlin/Compose app ──JNA──▶ libryubing.so (.NET NativeAOT) ──▶ Ryubing.HLE + ARMeilleure + Graphics.Vulkan
│ │
└──────── JNI ───────▶ libryubingjni.so (C++/NDK: ANativeWindow, Vulkan surface, adrenotools)
libryubing.so— the emulator core, published fromsrc/LibRyubingas a NativeAOT shared library for thelinux-bionic-arm64runtime. It is a greenfield Android headless host modeled on Ryubing's ownHeadlessRyujinx, referencing the upstream emulation projects directly.libryubingjni.so— a small C++/NDK shim for platform APIs the managed core cannot reach (Android surface, custom Vulkan driver loading via adrenotools).- Compose app —
src/RyubingAndroid, a native Android UI (game library, settings, on-screen controls).
See the full roadmap in the project plan.
| Path | Purpose |
|---|---|
upstream/ryubing/ |
Ryubing submodule (unmodified upstream source) |
src/LibRyubing/ |
NativeAOT Android host (libryubing.so) |
src/RyubingAndroid/ |
Kotlin/Compose app + JNI shim |
native-deps/ |
Scripts to cross-compile OpenSSL / OpenAL / FFmpeg for arm64 |
patches/ |
Numbered, need-driven patches applied to upstream/ryubing |
scripts/ |
Upstream sync + patch automation |
compat/pins.json |
Records which upstream commit each app version was built against |
docs/ |
Audit notes and design decisions |
Prerequisites:
- .NET SDK matching
upstream/ryubing/global.json - JDK 17 (Gradle daemon +
sdkmanager; Java 21 breakssdkmanagerwith a JAXB error) - Android SDK + NDK (local install — do not use the Arch
android-sdkpacman stack)
Bootstrap a user-local SDK under ~/Android/Sdk (writes src/RyubingAndroid/local.properties):
scripts/setup-android-sdk.shThis downloads Google's command-line tools, accepts licenses, and installs platform 36, NDK 27.2.12479018, and CMake 3.22.1. Override the install root with RYUBING_ANDROID_SDK=/path/to/sdk.
Optional shell env (fish):
set -gx ANDROID_HOME ~/Android/Sdk
set -gx ANDROID_SDK_ROOT ~/Android/Sdk
fish_add_path ~/Android/Sdk/platform-tools
fish_add_path ~/Android/Sdk/cmdline-tools/latest/bingit submodule update --init --recursive
scripts/apply-patches.sh # apply Android patch queue to upstream
cd src/RyubingAndroid && ./gradlew assembleDebugThe Gradle build invokes dotnet publish for libryubing.so and CMake for libryubingjni.so, then packages both into the APK.
scripts/sync-upstream.sh <tag-or-commit> # bump submodule, re-apply patches, sanity buildSee scripts/ and compat/pins.json.
Android wrapper code is MIT (matching Ryubing). Bundled native dependencies retain their own licenses (see the in-app About screen and distribution/legal upstream). This project does not distribute Nintendo firmware, keys, or games — users must provide their own.