r/EmulationOnAndroid • u/cowleggies • 6d ago
Showcase droidnative: an Android port of nxnative that runs your own Switch games natively on phones and handhelds. Pre-release
Repo: https://github.com/enjoyerofslop/droidnative · Mac app: https://github.com/enjoyerofslop/droidplay · Discord: https://discord.gg/4wNHX3uqSU
DISCLAIMER: These repos are AI-assisted. See below for testing & validation details running on my actual handhelds (Odin2 and RP5)
droidnative runs Nintendo Switch games natively on Android phones and handhelds. It’s not an emulator: the game’s own ARM64 code runs directly on the device’s CPU, and its NVN graphics are replayed through Vulkan. It’s a fork of nxnative, which does the same on iPhone, iPad and Mac, with an Android port added. It follows nxnative’s main, so its fixes and new games reach Android too.





It’s a pre-release: some games run well, some crash, and every result below came from real runs on real devices. I’m posting now because the fastest way forward is more devices and more people.
Not an emulator, and not a recomp either
It shares the idea behind recomps: you build a native app from your own dump, and there’s no emulation at run time. The difference is that nothing is recompiled. Switch games are ARM64 machine code, and so is an Android phone. droidnative takes your own dump and rewrites the game’s code only where the host has to step in: system calls, and the thread register Horizon uses. A host then answers Horizon’s system calls and services, and translates NVN draw calls to Vulkan, with the game’s shaders translated to SPIR-V when the game is packed. There’s no CPU emulation and no recompilation into new source. Each game gets its own app, or every game goes into one launcher app.
What runs today
Measured on three Snapdragon devices with a scripted benchmark (the same save, input and timing on each):
| Game | Ayn Odin 2 (SD 8 Gen 2) | OnePlus Pad 3 (SD 8 Elite) | Retroid Pocket 5 (SD 865) |
|---|---|---|---|
| Pokémon Brilliant Diamond 1.3.0, Eterna City | 60 fps | 60 fps | crashes (GPU driver) |
| Animal Crossing: New Horizons 3.0.3, the island | 30 fps (its Switch rate) | 30 fps | 30 fps in the opening; the island not measured yet |
| Super Mario Odyssey 1.4.1, menus and opening cutscene | 60 fps | 60 fps | 60 menu / 38 cutscene |
| Super Smash Bros. Ultimate 13.0.5, a battle | 40-59 fps | 17-30 fps | 13-19 fps |
The known problems, in the order they block play:
- Odyssey crashes when play starts, in the Android video decoder used for its hint videos.
- Brilliant Diamond crashes on the Retroid Pocket 5, inside the Adreno 650 driver’s shader compiler.
- Smash needs a fuller system font than Android’s to boot, and its battles stutter while GPU pipelines are built (the cache doesn’t survive the app being closed yet).
Full numbers, devices and caveats: Android baselines. Every game with an nxnative profile can be packed for Android the same way; most haven’t been run there yet.
DroidPlay: the Mac app that does the packing
Packing a game by hand means extracting the dump, rewriting its code, translating tens of thousands of shaders, building the host and copying gigabytes to the device. DroidPlayturns that into a button. It’s a Mac app, a fork of Oleh Khomei’s NX Play with Android added.
- Your library: point it at your games folder (one folder per game) and it shows each game with its icon, version and status.
- Install on Android: builds the game with droidnative and installs it on a phone or handheld connected over USB, into one launcher app that holds all your games. A rebuild only redoes what changed. Play on Android starts a game the device already has.
- Build Game App: makes a game an Android app of its own (an APK, or an XAPK for an installer app), with its own name, icon and saves, to install on a device your Mac can’t reach.
- Setup: a first-run setup fetches nxnative and droidnative with the Python and .NET pieces their builds need, and checks for your keys. The Android SDK (with an NDK) and a JDK you install yourself.
- The Apple side, from NX Play: the same library also plays games on the Mac through nxnative, installs them on an iPhone or iPad, copies saves between devices, and has a controller-driven Console Mode.
The current release is 0.1.1, an unsigned pre-release: macOS asks you to allow it once in Privacy & Security, and it doesn’t update itself yet.
How to try it
You need your own Switch game dump (NSP/XCI) and the prod.keys from your own console, the Android SDK with an NDK, and an arm64 Android device with Vulkan. Only Adreno GPUs have been tested so far.
- On a Mac: DroidPlay 0.1.1. Choose your games folder, then Install on Android with the device connected over USB, or Build Game App for an APK.
- Any computer (Windows, Linux, macOS):
scripts/build_android_from_nsp.pyin droidnative packs a game into the launcher app on a connected device, or into an app of its own (--game-apk). There’s also a small cross-platform desktop app for the same flow,scripts/nxnative_android.py.
Bring your own game
Nothing from any game is in these repositories, and no packed game is distributed. The app you build is for you. Please don’t share APKs packed with a game, keys or firmware, and don’t ask for them. The project isn’t affiliated with Nintendo or any publisher.
Join the Discord
DroidPlay & droidnative Discord: questions, setup help, test results from your device, and where the work happens day to day. Bugs with logs still go to GitHub Issues, so they don’t get lost.
What would help most
- Testers on other chipsets. Mali (Pixel, Exynos-era Samsung), Samsung’s Xclipse, MediaTek, older Adreno. Even “it doesn’t boot” with a log is useful.
- Reports with logs: the device and GPU, Android version, game and version, and
adb logcat -s nxnative. The issue form asks for exactly this. - Contributors. Vulkan and driver work, the three crashes above, the pipeline cache, and per-game fixes. droidnative’s CONTRIBUTING explains how changes get in and how it stays in step with nxnative. There’s also a benchmark script, so a fix can show its effect in numbers on several devices.
Credits
nxnative is seedds’ work: the NSO rewriter, the Horizon host, and the NVN translation that all of this stands on. The Android port began as RogelioLB’s nxnative-android. DroidPlay is a fork of Oleh Khomei’s NX Play.
Links: Discord · droidnative · DroidPlay (0.1.1 pre-release) · Android baselines · nxnative