Skip to content

About

Experimental 3DS emulator for Android handhelds like the AYN Thor and other dual-screen devices. Games run as ahead-of-time recompiled native code (Zakuro fork): Vulkan, HD texture packs, frame generation, mods.

Topics

Resources

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Repository files navigation

Zakuroishi: 3DS emulator for Android handhelds

An experimental Nintendo 3DS emulator for Android, built for dual-screen handhelds such as the AYN Thor. Games run as ahead-of-time recompiled native ARM64 code, with a Vulkan renderer, HD texture packs, frame generation and each screen on its own display. Nothing is decompiled: each game's code is recompiled once on a PC with 3dsrecomp.

Download the latest Android release · Setup guide · Report a problem

A good fit if Not for you yet if
You have a dual-screen handheld like the AYN Thor You want to install the app and play right away
You want HD texture packs at up to 3x, frame generation, and native recompiled game code You need broad, tested game compatibility
You're comfortable building each game's native code on a PC once You don't want to use a PC at all

An unofficial community fork, not an official release from the Zakuro developers. Previously named Zakuro Android. Existing installs update in place; the Android package, imported games and save locations are unchanged. Requires 64-bit ARM Android 11+ and Vulkan 1.3. Games need a decrypted ROM and matching Android ABI-5 native code built on a computer (ABI-4 builds still run); the APK does not compile games on your handheld. HD texture packs are optional.

Experimental Android frontend for Zakuro, merged with upstream v0.2.32 (c856685). It runs legally obtained decrypted 3DS games with separately built native game code. It includes no games, firmware, keys or texture packs.

This is a developer preview. Each game needs a native build made on a PC, with Rust and the Android NDK installed; the APK does not make one. Everything here was tested on one device (an AYN Thor), mostly with one game (Pokémon Ultra Moon). See known issues and the security notes: native game code and drivers you import run with the app's access.

Start here: Install, import and play. For an existing import that reports an incompatible native library, use the native-code compatibility and repair guide. An ARM64 file from Pocket Native is not automatically compatible: this host uses upstream 3dsrecomp's ABI 5 (and still runs ABI 4), while the inspected Pocket Native fastmem generator's own ABI 5 needs a fast-memory context this host lacks.

Documentation

Need Canonical page
Requirements, game folder, optional textures, controls and saves Android user guide
Build a matching Android game library; repair without recopying a ROM Native library contract
Every audited Pocket Native setting and upstream Zakuro feature Feature parity matrix
Architecture, APK toolchains, developer tests Development
What actually ran, on which source and architecture Verification record
Versioned changes, limitations and integration status Changelog
What is not tested or not working Known issues
What you trust, what the app checks, how to report Security
Controlled performance measurement without claims Benchmark protocol
Desktop Zakuro usage from the pinned upstream baseline Upstream desktop reference

Current scope

The Android app is io.github.zakuro.android, with a native Android library UI, validate-first game import and the existing Zakuro Vulkan renderer. Per-game settings control HD texture replacement, display layout/stretch/stereo, compiled code, supported shader/debug paths, motion, controllers, audio and console mode. A pause menu provides save/load, restart, screen swap and gyro recalibration.

Dual-display Presentation routing and optional custom Adreno Vulkan driver packs are implemented, with system-driver recovery. The external display uses a readback path; physical Thor routing, sensors and driver compatibility still need device verification. Original ROMs and Pocket Native installations are separate.

Version 0.1.7 presented 60 refreshes per second in Pokémon Ultra Moon at 3× with HD textures on an AYN Thor, while that game draws 30 pictures per second; it also fixed the Ultra Wormhole grey screen and made save restore accept ZIPs re-made on any computer. The 0.1.3 foundation repairs the ABI mismatch through a pinned Android game-code builder and code-only replacement. Texture packs are optional at import and can be attached later without copying a ROM again. In-game saves stay at a stable per-title path. Settings are saved only on confirmation.

The feature matrix maps every audited source setting to its actual consumer or an explicit limitation. Pocket Native's GLES-specific speed hacks are not automatically equivalent to this Vulkan backend; unsupported heuristics are not presented as working controls. This is an experimental test build, with recorded checks and hardware limits. No performance claim is made beyond what the testing record measures.

Verify the signing certificate

APKs published up to 0.3.1 are signed with a development certificate, CN=Zakuro Android Windows Test:

5821ce1e0d2c1aa009bc1d269ae3865d50ce1448854d067203ce406dea967228

Releases after 0.3.1 are signed with the release certificate, CN=Zakuroishi Release, O=Zakuroishi:

56d7615f627991436670380ccbb8b061b7bca717044d209607a98d44e4a82b0e

Check it with apksigner verify --print-certs APK. Android only updates an installed app from an APK whose certificate matches or descends from the installed one. New APKs carry a signed lineage from the old certificate to the new one (android/signing/lineage.bin), so they install over the old ones and keep your data. See Development.

Build the APK

From this repository in PowerShell, with the documented tools installed:

./android/scripts/build-windows.ps1
# Or Docker Desktop with a working Linux engine:
./android/scripts/build.ps1

These build the emulator APK, not a game's title.so. Both use the lockfile and write uniquely named signed test APKs. Tool versions, signing identities and the separate native game-code build are explained in Development and Native library contract. No publication or installation on a physical device is performed by these commands. A self-built APK is signed with a different key than the published ones and does not update over them.

Zakuro and the upstream Pocket Native work are credited in the source-backed matrix source inventory. This repository retains the MIT license. Upstream desktop game reports remain in COMPATIBILITY.md; they are not Android device-test results.

Support the project

Zakuroishi is free. If you want to support it, you can buy us a coffee on Ko-fi. Donations don't buy features or game support, and are never needed to use the app.

About

Experimental 3DS emulator for Android handhelds like the AYN Thor and other dual-screen devices. Games run as ahead-of-time recompiled native code (Zakuro fork): Vulkan, HD texture packs, frame generation, mods.

Topics

Resources

Contributing

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages