A modern J2ME emulator for Android handhelds and phones.
AbyssME is an independent fork of J2ME Loader, focused on making old mobile Java games feel at home on modern landscape handhelds. It keeps the proven emulation core while replacing the setup-heavy workflow with a game library, automatic first-launch preparation, and fast per-game controller mapping.
The current beta provides two installable variants built from the same emulation core: a controller-first Handheld APK and a portrait/touch-friendly Phone APK with an on-screen keypad.
Project status: Beta. AbyssME is usable, but compatibility automation and launcher integration still need testing across more games and devices.
For website copy, progress posts and handoffs, start with the current product/development status and dated changelog. They also describe local/private experiments, explicitly separated from public downloads. The fresh development screenshot pack shows experimental.15, not the published beta.2 interface pictured below.
The main branch is ahead of the published beta.2 APKs. Its unreleased changes
include a graphical controller mapper with diagonal bindings, two Phone touch
layouts, live Java game-image rotation, quick display settings, J2ME Loader
library import, menu-based backup/restore, a hideable screenshot button and
non-destructive database migrations. Saved Phone orientation and settings-field
contrast with Android's Light theme are also fixed in development builds.
Use Settings > Library > Library transfer to import from J2ME Loader or move installed games and saves between AbyssME installations. See the workflow and limitations.
Development builds share Display and Controls pages between the library's per-game settings and the in-game menu. On Phone, choose Controls > Touch layout > Phone / Gamepad. Use Try changes (or Try in game from the library), then Keep or Undo; unconfirmed changes revert after about 20 seconds of preview. Phone resolution and the full compatibility editor are under Advanced. The old expert editor still saves ordinary edits directly; its Fix game action now offers a trial instead. See settings trials.
Short landscape screens and Phone portrait now use a compact library: one header, larger game area and an on-demand library menu. Menus keep Close/Back visible while their contents scroll; short landscape also uses compact mapper pages. Handheld hides Android system bars; Gallery, List and Grid remain available. General Settings is split into Library, Playing and Support. Library transfer separates the operation chooser, game selection and results, leaving more room for the game list on small screens. The installer keeps its actions reachable while details and archive choices scroll. Installation errors stay visible until closed; deletion confirmations start on Cancel when using a controller. ZIP collections selected through Android's file picker now reach archive selection instead of being mistaken for a single JAR. Continuing past a mismatched JAD/JAR description now keeps the selected game and its original import identity, so reusing the same source URI finds the existing entry. A provider changing a file's URI can still create a duplicate; see #20. Automatic artwork now favors declared icons and identifiable title art over arbitrary textures. Game actions > Artwork offers custom icons/covers and an explicit refresh for older libraries. See artwork behavior.
The screenshots and beta.2 instructions below describe the published release, not every unreleased change.
The Wolphun author has responded positively to our integration request. We are documenting the permission's scope and preparing the licensing notices before publishing the combined build. Wolphun and the experimental Mophun integration are not yet part of this public source tree. See licensing status. Existing release downloads are unchanged.
Unretouched beta.2 captures from an Android 15 emulator, not a physical handheld. Games were installed separately; Gallery artwork was selected manually. The Phone capture uses the Phone keypad layout. Sources and capture details are in the screenshot manifest. Games are not bundled with the APKs.
- Controller-first landscape interface with Gallery, List, and Grid views
- Separate Phone build with portrait mode, direct touch input, and virtual keys
- Recent games, favorites, folders, search, sorting, and local artwork
- Automatic compatibility preparation the first time a game is launched
- Per-game named control profiles and a quick mapping overlay
- Live in-game controls for display preset and virtual screen size
- Android intent entry point for external launchers; ES-DE and Beacon setup notes
- JAR, JAD, ZIP, and 7Z sources through Android's Storage Access Framework
- Local-only library and diagnostics; no account, cloud service, or telemetry
- Android 10 or newer (API 29+)
- A physical controller is recommended for the Handheld build
The Handheld build is intentionally landscape-only and has no on-screen keypad. The Phone build has a rotatable library, a compact portrait layout, direct MIDP touch events, and configurable virtual controls. In beta.2, game launch still selects landscape unless the Phone keypad layout is active; honoring the saved game orientation is tracked in #3.
- Open Releases.
- Choose an APK:
AbyssME-...-fdroid-release.apkfor handhelds and physical controllers.AbyssME-...-phone-release.apkfor phones, portrait mode, and touch keys.
- Allow installation from your browser or file manager when Android asks.
- Install the APK and open AbyssME.
The package IDs are io.github.eriark.abyssme and
io.github.eriark.abyssme.phone, so both variants can be installed together.
Older J2ME Loader builds also use a different package.
- Choose Add game for one file, or Folders to index a collection.
- Select a JAR, JAD, ZIP, or 7Z file using Android's file picker.
- Start the game. On first launch, AbyssME analyzes metadata, resources and API hints to select initial display and compatibility settings, then saves them.
- On Handheld, tap the game display for quick View, Screen, and Controls actions, or hold Select for per-game mapping.
- On Phone, use the on-screen keypad. Its visibility, layout, colors, haptics, and direct game touch input can be changed in the game's settings. For the portrait layout shown above, open the in-game menu and choose Virtual keyboard > Switch keylayout > Phone.
In the library, Y toggles the selected game as a favorite and L1/R1 cycles Gallery, List, and Grid views.
AbyssME accepts read-only content:// game URIs through Android ACTION_VIEW.
The intended flow is to prepare a new source once, launch prepared games
directly, and return to the frontend on exit. End-to-end cold/warm launch and
return behavior still needs an ES-DE/Beacon verification pass; see
#7.
- Handheld package:
io.github.eriark.abyssme - Phone package:
io.github.eriark.abyssme.phone - Activity:
ru.playsoftware.j2meloader.MainActivity(both variants) - Action:
android.intent.action.VIEW - Supported files: JAR, JAD, ZIP, 7Z
ES-DE rule examples and Beacon setup details are in Launcher integration.
Automatic preparation is heuristic: it does not run the game under several phone profiles or verify that gameplay is correct. If a title has problems, open its settings and use Fix game to describe the symptom: wrong size/cropping, black screen/flicker, crash, or incorrect controls. The full expert settings remain available per game without cluttering the normal flow.
Game behavior varies between phone releases. When possible, start with the original build made for a common 176x220, 240x320, or 320x240 device profile.
See Contributing for the JDK/SDK versions, local signing setup and verification checklist. There is currently a clean-clone signing blocker, including for debug tasks; the guide documents a local development-key workaround. After that setup:
./gradlew :app:assembleFdroidDebug :app:assemblePhoneDebugOn Windows, use gradlew.bat. APK output is written under
app/build/outputs/apk/.
GitHub Actions is intentionally disabled. Builds and checks are run locally,
and release assets are uploaded manually.
- Beta builds have not yet been validated on every controller layout or Android phone/handheld combination.
- Automatic phone-profile detection is heuristic and can choose the wrong display size for unusual game releases.
- Archives containing several JAR files require a one-time game selection.
- Some vendor-specific J2ME APIs remain limited by the upstream emulation core.
- Published beta.2 lacks the migration fixes now present on
main; see #2. Back up libraries and saves before trying unreleased builds.
Please report reproducible problems through GitHub Issues and include the device model, Android version, game filename, and the symptom shown in AbyssME. Do not upload commercial game files.
Current work and unresolved decisions are tracked in Issues. Contribution instructions and the project layout are in CONTRIBUTING.md.
AbyssME is built on J2ME Loader by Nikita Shakarun and its contributors. It also includes open-source Mascot Capsule work originating from JL-Mod by woesss.
The current fork uses the Apache License 2.0, with separately licensed third-party components. In particular, the inherited Nokia/Symbian M3G implementation is under EPL-1.0. Preserve the component licenses and individual copyright notices in the source headers.
Licensing for a future Wolphun integration remains unresolved because of the existing EPL-1.0 M3G component. No license transition has taken effect; Wolphun is not included in public builds. See licensing status for the evidence and release requirements. Removing a repository license would not remove the obligations attached to inherited code.
Third-party games and artwork are not relicensed by this notice. The provenance and licenses of current test fixtures, plus the disposition of legacy files, are documented separately in test-games.






