A compatibility layer for porting Switch games to Android, one game at a time
  • C 33%
  • HTML 26.7%
  • Objective-C 19.4%
  • Python 17%
  • Assembly 2.2%
  • Other 1.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Tung Pham 70c8cb8a3b fix(perf): vote a lower window frame rate only once it holds
Super Mario Bros. Wonder asks for present interval 2 for a frame or a few
and then 1 again. Each ask was a new ANativeWindow_setFrameRate vote: 176 in
3 minutes of its first level on the Y700. On a display that changes its mode
for a vote, the switch makes the next frames late (issue #45: 30-40 fps).
A longer period now goes to the window only after 60 presents; a shorter one
still goes at once. On the Y700 a run now makes 2 votes and holds 60 fps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 12:17:00 +07:00
.claude feat(profile): Pokémon Legends: Z-A 2026-11-04 02:55:12 +07:00
.githooks ci(hooks): a commit-msg hook that enforces Conventional Commits 2026-10-28 10:55:43 +07:00
.github/workflows ci(release): actions on Node 24, the newest LTS runtime Actions has 2026-10-31 14:06:49 +07:00
devtools Merge branch 'feature/readme-logo-app-icon-a55bb3': Overlap logo in the README and as the app icon 2026-10-31 14:05:37 +07:00
docs feat(profile): Pokémon Legends: Z-A 2026-11-04 02:55:12 +07:00
gui feat(vk): multithread replay, custom Vulkan drivers and a steadier frame step 2026-11-04 00:11:26 +07:00
nxnative fix(perf): vote a lower window frame rate only once it holds 2026-11-04 12:17:00 +07:00
packaging feat(porter): --touch, the on-screen gamepad starts hidden for a game played by touch 2026-10-31 15:21:05 +07:00
porter feat(porter): Trinity packs' shaders decoded by the game on the device 2026-11-04 02:15:09 +07:00
probes nx2android: research, device probes and development scripts 2026-10-25 00:24:45 +07:00
tests fix(vk): let texture view swizzles override parent selectors (#89) 2026-11-04 07:48:40 +07:00
.gitattributes nx2android: research, device probes and development scripts 2026-10-25 00:24:45 +07:00
.gitignore docs: drop the upstream remote from the guides 2026-10-31 13:05:07 +07:00
CLAUDE.md docs(claude): clean up a worktree after its merge, and remove tools/ links first 2026-10-31 14:41:43 +07:00
README.md feat(profile): Pokémon Legends: Z-A 2026-11-04 02:55:12 +07:00
requirements.txt feat(porter): port NSZ and XCZ dumps, decompressed into a temporary folder 2026-10-29 13:51:02 +07:00
RESEARCH.md nx2android: research, device probes and development scripts 2026-10-25 00:24:45 +07:00

nx2android

Port your own Nintendo Switch games to Android, natively: the game's own arm64 code runs on the device, with the Switch's system services stood in for by a host and NVN graphics replayed on Vulkan. Pick the game's folder, click Port, and get an APK plus the game's data, installed on your device if you like. Bring your own game files and keys; nothing from any game is in this repository.

This is the Android port of nxnative, which does the same on iPhone and iPad. Supported games: Games.

Games

These games play on Android. Tested on a Lenovo Legion Y700 (Snapdragon 8 Elite, Adreno 830). The device's GPU must read BC-compressed textures (Adreno, Xclipse; not Mali or PowerVR).

13 Sentinels: Aegis Rim
13 Sentinels: Aegis Rim
v0.1.3 · update 1.10 · 60 fps
Advance Wars 1+2: Re-Boot Camp
Advance Wars 1+2: Re-Boot Camp
v0.1.3 · base game 1.0.0 · 60 fps (30 in battle on Switch)
Blasphemous 2
Blasphemous 2
v0.1.3 · update 1.0.8 · 60 fps
Captain Toad: Treasure Tracker
Captain Toad: Treasure Tracker
v0.1.3 · update 1.4.2 · 60 fps
Castlevania: Belmont's Curse
Castlevania: Belmont's Curse
v0.2.0 · update 1.1.0 · 60 fps
Celeste
Celeste
v0.1.3 · update 1.4.1.1 · 60 fps
Donkey Kong Country Returns HD
Donkey Kong Country Returns HD
v0.1.3 · update 1.1.0 · 60 fps
Graveyard Keeper 2
Graveyard Keeper 2
v0.1.2 · update 1.0.4 · 60 fps (30 on Switch)
Hades II
Hades II
v0.1.2 · update 1.0 · 60 fps
Hollow Knight: Silksong
Hollow Knight: Silksong
v0.1.3 · update 1.0.30000 · 60 fps
Mario vs. Donkey Kong
Mario vs. Donkey Kong
v0.1.3 · update 1.0.1 · 60 fps
Metroid Dread
Metroid Dread
v0.2.0 · update 2.1.0 · 60 fps
NEO: The World Ends with You
NEO: The World Ends with You
v0.1.2 · update 1.03
Paper Mario: The Origami King
Paper Mario: The Origami King
v0.2.0 · update 1.0.1 · 60 fps (30 on Switch)
Paper Mario: The Thousand-Year Door
Paper Mario: The Thousand-Year Door
v0.2.0 · update 1.0.1 · 60 fps (30 on Switch) · work in progress: playable, but lighting flickers (walls go black for single frames after a fall)
Pokémon Legends: Arceus
Pokémon Legends: Arceus
v0.2.0 · update 1.1.1 · 60 fps (30 on Switch)
Pokémon Legends: Z-A
Pokémon Legends: Z-A
v0.3.0 · update 2.0.2 · 30 fps (as on Switch) · tested to Lumiose station: the city and battles not checked yet
Super Mario Bros. Wonder
Super Mario Bros. Wonder
v0.1.3 · update 1.2.1 · 60 fps, dips to 40
Super Mario Odyssey
Super Mario Odyssey
v0.2.0 · update 1.4.1 · 60 fps · shake the device to throw Cappy
Tales of Eternia Remastered
Tales of Eternia Remastered
v0.1.2 · update 2.0.0 · 60 fps
The Legend of Zelda: Tears of the Kingdom
The Legend of Zelda: Tears of the Kingdom
v0.3.0 · update 1.4.3 · 30 fps, 60 in caves and shrines · smoothest with a Turnip Vulkan driver · work in progress: 60 fps in the open world
UNDER NIGHT IN-BIRTH Exe:Late[cl-r]
UNDER NIGHT IN-BIRTH Exe:Late[cl-r]
v0.2.0 · update 1.0.3 · 60 fps
UNDER NIGHT IN-BIRTH II Sys:Celes
UNDER NIGHT IN-BIRTH II Sys:Celes
v0.2.0 · update 1.42 · 60 fps
Unicorn Overlord
Unicorn Overlord
v0.1.3 · update 1.05 · 60 fps · boots: saving and a full battle not tested yet
Unpacking
Unpacking
v0.1.2 · update 2.01 · 60 fps · played by touch
Viractal: Will You Trust Your Party?
Viractal: Will You Trust Your Party?
v0.1.0 · update 1.4.5
Xenoblade Chronicles 3
Xenoblade Chronicles 3
v0.1.0 · update 2.2.0 · 30 fps · work in progress: some effects and models don't draw yet

The tag (v0.1.3) is the latest nx2android version the game was tested on. Older games are not tested again for each release: if a later version breaks one, a patch release fixes it. A tag newer than the latest release is the next release, and the game needs the development checkout until it ships.

A game that is not in this table is not supported yet. The games we look at next, and the ones done: docs/PORT_CHECKLIST.md.

For players: port a game without programming

  1. Download nx2android-<version>-windows-x64.zip (Windows) or nx2android-<version>-macos-arm64.zip (Mac with Apple silicon) from Releases, unzip it and start nx2android (on a Mac, see packaging/INSTALL.md first).
  2. Setup tab: click Download missing tools (the Android NDK, the .NET SDK and platform-tools, about 1 GB, from Google and Microsoft), then set your prod.keys. Every line turns green.
  3. Port tab: choose the folder with the game's NSP, XCI, NSZ or XCZ files (base game, update, DLC) and click Port.
  4. Tick Install on the device when done with the device plugged in and USB debugging on, or copy the APK and the data folder yourself.

A game played by touch: tick Touch game on the Port tab (--touch). The on-screen gamepad then starts hidden and every touch but one on the menu button goes to the game; the pause menu shows the gamepad again.

A game slowed by its draw calls in busy scenes: tick Multithread replay on the Port tab (--mt-replay). The game's Vulkan commands are then recorded on a thread of their own. It stays on until you port the game again without it.

To arrange the on-screen controls, open the pause menu's Gamepad tab and choose Edit layout: drag a control to move it, pinch or use − / + to resize it. Save keeps the layout for the next launch and Cancel discards your edits. Snap to grid (off at first, and remembered) shows a square grid and snaps each control's center to it as you drag.

A game that crashes with "AllocateAddressRegion … refused (0x1803)" in its log needs more address space: port it again with a larger Extra address space on the Port tab (--alias-headroom on the command line). packaging/INSTALL.md says more.

The step-by-step guide is packaging/INSTALL.md. You need your own game files and prod.keys, dumped from your own Switch; the tool never ships or downloads either. NSZ and XCZ files are decompressed during the port (into the build folder's tmp/, deleted once extracted).

Saves

The game's pause menu (Game tab) has Export save and Import save: an export is a folder in Android/data/<package>/files/saves/ on the device, the save's files as a console's save tools copy them, so a save from a console imports the same way. The app's Saves tab moves them between the device and the PC.

An import replaces the save the game has; the app exports that one first on the device (a folder ending -before-import). Uninstalling the app deletes its saves and its exports: copy them to the PC first.

For developers

Running from the repository, the command line, the repository layout, building the bundle, tests and commit messages: docs/DEVELOPMENT_GUIDE.md. How it is put together: docs/ARCHITECTURE.md.

Keys and game files

nx2android decrypts your game files with your prod.keys while it ports them, as Switch emulators do. This repository and its releases contain no keys, no game files and nothing extracted from them, and the tool never downloads either. Dump both from your own Switch, and don't share them or the APKs and data packs built from them.

Nintendo's takedown notices so far have gone to whoever hosts a project (13 Switch emulator repositories on GitHub in February 2026), not to players. Whether decrypting your own games for your own use is allowed depends on where you live.

License

MIT, as nxnative (see nxnative/LICENSE). Third-party code keeps its own license.