Skip to content
CrossFly is 100% open sourceFollow us on GitHub
CrossFlyCrossFly
Get started

This page was machine-translated from Portuguese and may contain errors. The Portuguese version is canonical.

Platform and feature matrix

CrossFly is a multi-module Gradle project: the UI and logic live in core (neutral), and each launcher (lwjgl3, android, ios, web) only handles the OS bootstrap. The same Java code runs on all four targets.

core — UI + logic (neutral)

🖥️ lwjgl3 → LWJGL3

🤖 android → Android

🍎 ios → RoboVM (AOT)

🌐 web → TeaVM + WebGL2

Platform detection

if (Device.platform.isDesktop()) { ... }   // WINDOWS/LINUX/MACOS
if (Device.platform.isMobile()) { ... }     // ANDROID/IPHONE/IPAD
if (Device.platform.isIOS()) { ... }

Platform: JAVA · WINDOWS · LINUX · IPHONE · ANDROID · IPAD · MACOS.

Support matrix by feature

Feature 🖥️ Desktop 🤖 Android 🍎 iOS 🌐 Web
Render UI ✅ ✅ ✅ ✅
Camera / barcode ⚠️¹ ✅ ✅ ❌
GPS / location ❌ ✅ ✅ ❌
Bluetooth BLE ⚠️ ✅ ✅ ❌
Biometrics ⚠️ ✅ ✅ ❌
Native maps ✅ ✅ ✅ ❌
WebContainer ✅ ✅ ✅² ❌³
Vibration ❌ ✅ ✅ ❌
Voice (TTS/STT) ⚠️ ✅ ✅ ❌
File persistence ✅ ✅ ✅ ❌⁴
HTTP ✅ ✅ ✅ ⚠️⁵

✅ supported · ⚠️ limited/varies · ❌ stub (does nothing useful)

  1. Camera on desktop varies by OS (e.g., Mac ARM may return null).
  2. WKWebView with restricted evaluateJavaScript (iOS).
  3. createWebView() returns null on the web (Web).
  4. Device.homeFolder is null on the web.
  5. HTTP on the web has restrictions (CORS, no sockets) — Utils.getRemoteFile returns null.

Golden rule for portability: every device feature may not exist on a given target. Check before using it (Device.platform, createWebView() != null, null return) — see Native integration.

Which page to read

Target Page
🖥️ iterate fast Desktop (LWJGL3)
🤖 Android phone Android
🍎 iPhone/iPad iOS (RoboVM)
🌐 browser Web (TeaVM)
wire code to the OS Native integration
package and publish Build and distribution
Was this page helpful?