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, while 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: "source src/libretro/freej2me_libretro.c:38-45 (freej2meapp), source src/libretro/freej2me_libretro.c:859-875 (GET_SYSTEM_DIRECTORY, freej2me_present, SYSTEM_NOT_FOUND_MSG), source src/libretro/freej2me_libretro.c:339-346 (access F_OK), upstream src/libretro/freej2me_libretro.c:877-888 (java -jar argv), source 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: "source src/javax/microedition/media/Manager.java:55, source src/javax/microedition/media/Manager.java:328-351, source 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: "source src/org/recompile/mobile/PlatformFont.java:63, source src/org/recompile/mobile/PlatformFont.java:133-154, source src/org/recompile/mobile/Mobile.java:1062-1064"