samiul@portfolio:~/projects/mobile-java$ cat README.md

09 MobileJava

[mobile] [java] [updated 2026-08] [release v0.3.0-m5]

A full OpenJDK HotSpot 21 running inside an Android app, with guest Java owning the game loop.

samiul@portfolio:~/projects/mobile-java$ cat problem.txt

Android apps run on ART. The goal was the standard desktop JVM, HotSpot, in the same process, with guest Java code driving frames and input.

samiul@portfolio:~/projects/mobile-java$ cat build.log

A bionic-built OpenJDK HotSpot 21 embedded in an Android app and booted in-process via JLI_Launch, a leaner cut of the PojavLauncher architecture. The guest owns the loop: it polls touch over a JNI control bridge and renders an EGL/GLES2 scene through natives it loads itself. It survives HOME and back: the surface is recreated while the EGL context and Java state persist. It runs under a device-tier memory policy (tiered heap, G1 uncommit, SerialGC on low-RAM devices) and ships per-ABI builds, so each APK carries one ~48 MB JRE. Every milestone was verified on an emulator with proof files.

samiul@portfolio:~/projects/mobile-java$ cat highlights.txt

  • HotSpot 21 booted in-process via JLI_Launch
  • Guest Java owns the frame loop and input over JNI
  • Survives HOME/back: context and state outlive the surface
  • Device-tier memory policy: G1 uncommit, tiered heap, SerialGC
  • Per-ABI JRE packs, ~48 MB per APK, byte-stable builds

samiul@portfolio:~/projects/mobile-java$ cat stack.toml

# mobile-java

jvm = "openjdk hotspot 21 (bionic)"

boot = "jli_launch in-process"

loop = "guest java owns frames + input"

gl = "egl / gles2 via guest natives"

ship = "per-abi jre packs, ~48 mb apks"

stack = ["Java", "JNI", "Android", "OpenGL ES"]

samiul@portfolio:~/projects/mobile-java$ git remote -v

interactive shell: try help, ls, open 04, phosphor amber

SH‑TERM  ▚  MODEL 2026