emulator: FreeJ2ME-Plus type: libretro core_classification: enhanced_fork source: "https://github.com/TASEmulators/freej2me-plus" upstream: "https://github.com/hex007/freej2me" profiled_date: "2026-10-04" source_commit: "68069d79aa6ed106eb788a640a8294a0db55fdcd" upstream_commit: "8b9bc8a19baf26e3d92f88934a64a32f1cbc2795" core_version: "1.53" display_name: "Mobile - J2ME (FreeJ2ME-Plus)" cores: - freej2me_plus systems: - j2me notes: | Fork of FreeJ2ME adding phone-specific APIs (Siemens, Nokia, Motorola, KDDI, SKT, DoJa, JBlend, Mascot Capsule V3, M3G), KJX loading and more core options. The native core is a C bridge: retro_init reads the system directory, checks that freej2me_plus-lr.jar exists there and spawns java -jar with the file encoding and the screen size as arguments, then drives the Java process over pipes. Windows launches javaw through CreateProcess with the system directory as starting directory; Linux and macOS fork, chdir() into it and execvp() java. A Java runtime must be on the host PATH, and the start failure message asks for Java 6 or newer. The jar is built by ant from build.xml, which writes the libretro variant as freej2me_plus-lr.jar. ref: src/libretro/freej2me_libretro.c:38-45, src/libretro/freej2me_libretro.c:859-888, src/libretro/freej2me_libretro.c:1556-1582, src/libretro/freej2me_libretro.c:1679-1688, src/libretro/freej2me_libretro.h:80, build.xml:86-99 Only existence is tested. When the jar is absent the core posts the SYSTEM_NOT_FOUND message and returns from retro_init before any process is created, so nothing loads. The message text still names freej2me-lr.jar, the file the original core opens; this core opens freej2me_plus-lr.jar. ref: src/libretro/freej2me_libretro.c:339-346, src/libretro/freej2me_libretro.c:866-872, src/libretro/freej2me_libretro.h:73-79 Every relative path the jar opens resolves against the system directory, since the Java process starts there. freej2me_system/ is created on first run and holds freej2me.conf (written with defaults when missing, then overridden by the core options the bridge sends), FreeJ2ME.log, and the SiemensData/ and XceData/ directories that the Siemens and XCE file APIs write to. FreeJ2MEDumps/KDDI/ receives the jar and jad extracted from a .kjx. Saves go to /freej2me/ (rms// and config//game.conf), falling back to the system directory when the frontend has no save directory. ref: src/org/recompile/freej2me/Config.java:47-48, src/org/recompile/freej2me/Config.java:186-206, src/org/recompile/mobile/Mobile.java:121-123, src/org/recompile/mobile/Mobile.java:135, src/libretro/freej2me_libretro.c:926-934, src/org/recompile/freej2me/Libretro.java:201-205, src/javax/microedition/rms/RecordStore.java:111 Two files are user supplied and optional. With the freej2me_midifont core option on, Manager.checkCustomMidi loads the first .sf2 or .gm listed in freej2me_system/customMIDI/ as the MIDI soundbank; off, or with the directory empty, the JVM default soundbank is used. With freej2me_textfont on, PlatformFont loads the first .ttf, .otf or .ttc in freej2me_system/customFont/; off, the AWT SansSerif, Monospaced and Dialog faces are used. Both directories are created with a placeholder file when missing, and neither file has a fixed name. ref: src/libretro/freej2me_libretro.c:464-469, src/libretro/freej2me_libretro.c:480-485, src/org/recompile/freej2me/Libretro.java:240, src/org/recompile/freej2me/Libretro.java:254, src/org/recompile/mobile/Mobile.java:1056-1064, src/javax/microedition/media/Manager.java:55, src/javax/microedition/media/Manager.java:328-351, src/org/recompile/mobile/PlatformFont.java:63, src/org/recompile/mobile/PlatformFont.java:133-154 files: - name: "freej2me_plus-lr.jar" system: j2me path: "freej2me_plus-lr.jar" required: true validation: [existence] description: "FreeJ2ME-Plus libretro Java application" note: "Java program the native core launches with java -jar from the system directory root. Built by ant from build.xml at the pinned revision; the code reads no size and no hash." source_ref: "src/libretro/freej2me_libretro.c:38-45 (freej2meapp), src/libretro/freej2me_libretro.c:859-875 (GET_SYSTEM_DIRECTORY, freej2me_present, SYSTEM_NOT_FOUND_MSG), src/libretro/freej2me_libretro.c:339-346 (access F_OK), src/libretro/freej2me_libretro.c:877-888 (java -jar argv), build.xml:86-99 (destfile)" - name: ".sf2" system: j2me path: "freej2me_system/customMIDI/.sf2" required: false unsourceable: "user supplied, no canonical file" category: game_data description: "MIDI soundbank for J2ME audio" note: "First .sf2 or .gm in the directory listing, loaded through MidiSystem.getSoundbank when the freej2me_midifont option is on. A rejected file is logged and the JVM default soundbank stays." source_ref: "src/javax/microedition/media/Manager.java:55, src/javax/microedition/media/Manager.java:328-351, src/org/recompile/mobile/Mobile.java:1056-1058" - name: ".ttf" system: j2me path: "freej2me_system/customFont/.ttf" required: false unsourceable: "user supplied, no canonical file" category: game_data description: "TrueType font for J2ME text" note: "First .ttf, .otf or .ttc in the directory listing, loaded through Font.createFont when the freej2me_textfont option is on. A rejected file is logged and the AWT faces stay." source_ref: "src/org/recompile/mobile/PlatformFont.java:63, src/org/recompile/mobile/PlatformFont.java:133-154, src/org/recompile/mobile/Mobile.java:1062-1064"