Use Nintendo Switch 2 Joy-Con 2 and Pro Controllers on Android — as gamepads in any app, and with motion in emulators.
Android can't pair these controllers from its Bluetooth settings, because they use their own BLE protocol rather than standard HID. Joycon2Android connects to them itself and presents each player as an ordinary gamepad.
- Joy-Con 2 and Switch 2 Pro Controller — connect several at once, GL/GR paddles included.
- Up to 8 players — each with a sideways Joy-Con, a pair, or a Pro Controller.
- A gamepad per player — every app sees one standard controller per player, so multiplayer just works.
- Motion for emulators — a DSU (cemuhook) server streams gyro, accelerometer, buttons and sticks for players 1–4.
- One-tap emulator setup — writes controller and motion bindings for Eden and Dolphin.
- Custom button mapping — choose which button drives which emulator button, per console.
- Live readout of buttons, sticks, motion and battery, with each card in the controller's real shell colour.
- Android 7.0 (API 24) or newer, with Bluetooth LE
- Joy-Con 2 or a Switch 2 Pro Controller
- Shizuku, for the virtual gamepad and emulator auto setup — DSU motion works without it
Important
Press SYNC every time you connect. Only a Switch 2 can wake a controller back up from a button press (why).
- Download the APK from the latest release and install it. Allow Nearby devices when asked.
- Install Shizuku from Google Play
or GitHub, and start it:
- Wireless debugging (no root, recommended): Developer options → Wireless debugging, then pair from Shizuku's notification.
- ADB:
adb shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh - Root: tap Start.
- Hold SYNC on the controller and tap Scan.
- Assign each controller to a player — from the app, or with the Switch combos: L on one Joy-Con and R on another for a pair, SL + SR for a sideways Joy-Con, L + R on a Pro Controller.
Turn on Virtual Gamepad and grant Shizuku permission the first time. Each player appears to every
app as its own controller, Joy-Con Virtual Gamepad <N>. The app stays connected in the background
while its notification is showing.
A gamepad has no motion channel, so for gyro aiming turn on DSU Motion Server. Emulators on the
same device connect to 127.0.0.1:26760.
- Players 1–4 get motion. A pair streams from its right Joy-Con, and its left one too when a slot is free.
- Rest each controller for ~2 s at the start; the gyro recalibrates whenever it's still.
- Motion settings on the DSU card has two options: Ignore this device's motion in Eden (on by default, needs Shizuku), and Faster motion updates for smoother aiming at a battery cost.
Tip
DSU and the virtual gamepad are independent. With both on, an emulator sees each controller twice — map from one, and turn the gamepad off while mapping DSU inputs so detection doesn't grab it.
Both cards have Emulator auto setup: pick an emulator and tap Set up. The app offers to start the emulator afterwards — it only reads its config when it starts.
| Card | Emulators | What it writes |
|---|---|---|
| Virtual Gamepad | Eden, Eden Nightly, Dolphin (GameCube) | buttons and sticks |
| DSU Motion Server | Eden, Eden Nightly, Dolphin (Wii) | buttons, sticks and motion |
The gamepad button beside Set up opens the mapping editor. A single Joy-Con is set up as a Pro Controller held sideways, so every button works in every game (why).
Note
Auto setup needs Shizuku, and some devices block writing into another app's Android/data — use
manual setup if it fails. Emulators rewrite their config when they exit, so let the
app close an open one first. Run Set up again after changing players or updating the app.
The DSU server binds each player to slot N−1. Press-to-detect in Android emulators never sees DSU inputs, so pick them from the input list instead.
DSU input names
DSU uses DS4 names. SL, SR and C aren't streamed, except that a sideways Joy-Con's SL/SR arrive as its shoulder buttons.
| Button | DSU name | Button | DSU name |
|---|---|---|---|
| A | Circle |
B | Cross |
| X | Triangle |
Y | Square |
| L / R | L1 / R1 |
ZL / ZR | L2 / R2 |
| − / + | Share / Options |
LS / RS | L3 / R3 |
| Home | PS |
Capture | Touch Button |
| D-pad | Pad N/S/E/W |
Sticks | Left X±/Y±, Right X±/Y± |
Eden
- In Eden's controller settings, turn on motion and the UDP controller, and add
127.0.0.1:26760as a server. - Point each player's buttons, sticks and motion at the UDP controller. A pair has two motion inputs: the second reads the left Joy-Con's own slot.
Dolphin (Wii)
-
Create
Android/data/org.dolphinemu.dolphinemu/files/Config/DSUClient.inicontaining exactly:[Server] Enabled = True Entries = Joycon2:127.0.0.1:26760;
-
Restart Dolphin and open Wii Remote N → Emulated. A
DSUClient/<slot>/Joycon2device appears once Dolphin's DSU client starts — open a mapping screen or a game first. -
Map buttons from the input list (long-press → Advanced Mapping).
-
Under Motion Input, map the accelerometer and gyroscope, and map Recenter — press it while aiming at the screen centre to bring the pointer back. A pair maps name-to-name; a single Joy-Con streams in its sideways grip, so map it back to the remote's body:
Dolphin input Pair Left Joy-Con Right Joy-Con Accelerometer Up / Down Accel Up/Downsame same Accelerometer Left / Right Accel Left/RightAccel Backward/ForwardAccel Forward/BackwardAccelerometer Forward / Backward Accel Forward/BackwardAccel Left/RightAccel Right/LeftGyroscope Pitch Up / Down Gyro Pitch Up/DownGyro Roll Right/LeftGyro Roll Left/RightGyroscope Roll Left / Right Gyro Roll Left/RightGyro Pitch Up/DownGyro Pitch Down/UpGyroscope Yaw Left / Right Gyro Yaw Left/Rightsame same -
Under Swing, set Forward to
(`Accel Forward` - `Accel Backward`) - smooth((`Accel Forward` - `Accel Backward`), 0.03), Range to 7% and Dead Zone to 20%. For a single Joy-Con, useAccel UpandAccel Down. This lets thrusts reach games like Wii Play Billiards (why). -
Pair only: under Nunchuk → Motion Input, map each accelerometer entry to the left Joy-Con's slot, e.g.
`DSUClient/3/Joycon2:Accel Up`— the highest slot no player uses (3 with one player).
[!WARNING] Leave Dolphin's Sideways Wii Remote off with this mapping — it rotates motion a second time.
| Problem | Fix |
|---|---|
| "Shizuku is not running" | Open Shizuku and start it |
| "Shizuku permission denied" | Shizuku → Apps → allow Joycon2Android |
| Controller not found | Hold SYNC again and move closer |
| Controller stops responding | Press SYNC and reconnect; wait a moment if it stays silent |
| Gamepad doesn't show up in games | Check adb shell getevent -p lists "Joy-Con Virtual Gamepad" |
| No DSUClient device in the emulator | Check the server address, restart the emulator and open a mapping screen; adb logcat -s DsuServer shows whether it's connecting |
| Emulator won't detect DSU presses | Pick inputs from the list — detection never sees DSU — with the virtual gamepad off |
| Motion aiming stutters | DSU card → Motion settings: keep Ignore this device's motion in Eden on, and try Faster motion updates |
| Tilting the device moves the aim in Eden | Turn on Ignore this device's motion in Eden |
| Pointer drifts or starts off-screen | Rest the controller for ~2 s, then press Recenter |
| MotionPlus tutorial replays every boot (Dolphin) | Set MPLS.MOVIE in Wii/shared2/sys/SYSCONF with Dolphin closed (why) |
Planned and in-progress work is on the project board.
Every card is an issue you can subscribe to, and area: labels filter it to the parts
you use. Found a bug or want something? Open an issue.
Start with CONTRIBUTING.md, then the docs:
- Architecture and adding a feature
- BLE protocol — identifiers, packets, Android BLE gotchas
- Virtual gamepad — UHID, keycodes, sideways Joy-Cons
- DSU motion — slots, motion frames, emulator mapping details
- Debug tools — a DSU client for inspecting the stream
Built on the community's reverse-engineering work, in particular:
- Joycon2forMac by seitanmen — the working macOS BLE implementation the connection sequence, init commands and packet layout came from.
- JoyconDriver by german77 — Switch controller protocol docs, including the Switch 2 Wireshark dissector and SPI flash map (shell colours).
- ProCon 2 Enabler Tool by HandHeldLegend — a Web Bluetooth implementation whose SPI-read bytes unlocked reading controller colours.
- Nintendo_Switch_Reverse_Engineering by dekuNukem — the original Joy-Con docs, and the battery voltage thresholds.
- cemuhook protocol docs by v1993 — the DSU wire format.
- Shizuku by RikkaApps — privileged access without root.
GNU General Public License v3.0. If you find this useful, you can support development on Ko-fi.
Not affiliated with, endorsed by, or sponsored by Nintendo. Joy-Con, Nintendo Switch and GameCube are trademarks of Nintendo. The BLE protocol was reverse-engineered by the community from their own hardware; this project contains no Nintendo code.
Claude (Anthropic's AI assistant) was used in building this project, directed and reviewed throughout by a professional software and Android engineer.