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

CrossFly vs Kotlin Multiplatform

This is the closest comparison on the board — both CrossFly and Kotlin Multiplatform come from the JVM world and compile to native binaries, so “native performance” is a tie. The real differences are language and UI model: CrossFly is plain Java with one GPU-drawn UI everywhere; KMP is Kotlin that shares your business logic while the UI stays native per platform (or uses Compose Multiplatform, whose iOS support only became stable in 2025).

The short version — KMP is excellent when you're a Kotlin/Android shop that wants to share logic and keep native UIs. CrossFly wins when you want to stay in Java, ship one UI across desktop and mobile, and skip Kotlin/Native's iOS interop and the Gradle/CocoaPods build friction.

Stay in Java
no team-wide move to Kotlin
1 shared UI
not “share logic, rebuild UI per platform”
No ObjC bridge
no Kotlin→ObjC→Swift translation tax
CrossFly · Java

CrossFly is an open-source (Apache 2.0) framework where you write UI and logic in plain Java and it renders on the GPU via LibGDX/OpenGL, compiling to native binaries for Desktop (Windows, macOS and Linux), Android and iOS — plus a WebGL build that runs in any modern browser — Chrome, Firefox, Safari and others. Pair it with CrossFly Sync for offline-first data.

Kotlin Multiplatform · Kotlin

Kotlin Multiplatform (KMP) is JetBrains' open-source (Apache 2.0) technology for sharing code — logic, networking, data — across Android, iOS, desktop and web, while UI stays native per platform. Compose Multiplatform is its optional shared-UI toolkit (Skia-rendered), stable on iOS since May 2025.

The differences that actually matter

Two JVM cousins, two very different bets on language, UI and tooling.

01 · Difference

It's Kotlin-first, not Java

The catch with Kotlin Multiplatform

KMP's shared code is Kotlin. Kotlin has great Java interop on the JVM, but Kotlin/Native (iOS) and Kotlin/Wasm are Kotlin toolchains — not “run your existing Java.” A pure-Java enterprise team has to commit to Kotlin as its shared language.

With CrossFly

CrossFly keeps you in Java end to end. There's no team-wide language migration — your Java developers, libraries and idioms carry straight into the app on every platform.

02 · Difference

The iOS interop layer is lossy

The catch with Kotlin Multiplatform

On iOS, Kotlin talks to Swift only through a generated Objective-C bridge. That translation is where the sharp edges live: nullable ints get boxed, sealed classes lose exhaustive switch, Kotlin Flow becomes clunky callbacks, generics collapse to Any?. JetBrains' idiomatic fix, Swift Export, isn't ready yet.

With CrossFly

CrossFly has one rendering and logic path drawn on the GPU — there's no Kotlin→Obj-C→Swift boundary to cross, so none of those interop losses appear in the first place.

03 · Difference

Shared UI on iOS is young

The catch with Kotlin Multiplatform

If you want to share the UI too, that's Compose Multiplatform — which reached stable on iOS only in May 2025, with text-field accessibility landing even later, and web/Wasm still in beta. It's Skia-rendered (not native widgets), so on iOS it looks like Material, not Cupertino.

With CrossFly

CrossFly's draw-your-own-UI model is the whole framework, not a recently-stabilised layer — one consistent UI across desktop and mobile from day one. (If you need per-platform native look, KMP's native-UI option is a real strength — see the fair-play column.)

04 · Difference

The build matrix is the tax

The catch with Kotlin Multiplatform

KMP means Gradle-multiplatform — which JetBrains itself calls “overwhelming” — plus brittle CocoaPods integration, an iOS plugin that only works on macOS, and slow Kotlin/Native compiles. Expect real setup and iteration friction, especially on the iOS side.

With CrossFly

CrossFly's single-language, single-toolchain model keeps the build story far simpler — fewer moving parts between you and a running app on all three platforms.

Where CrossFly pulls ahead

Plain Java — your existing Java team ships cross-platform without adopting Kotlin as the shared language.
One GPU-drawn UI for every target, instead of sharing logic and rebuilding UI per platform.
No Kotlin→Objective-C→Swift interop layer, so none of its boxing/sealed-class/Flow translation losses.
A simpler build story — no Gradle-multiplatform + CocoaPods matrix to tame.
CrossFly Sync delivers offline-first data as a product, not a library you assemble.

Where Kotlin Multiplatform is genuinely strong

Built by JetBrains and officially supported by Google for Android/iOS logic sharing.
Kotlin is a modern, well-liked language with excellent JVM interop.
Uniquely flexible UI: ship 100% native SwiftUI/UIKit, or shared Compose Multiplatform.
Mature, production-proven desktop via Compose for Desktop; adopted by Netflix, McDonald's and Cash App.

CrossFly vs Kotlin Multiplatform at a glance

DimensionCrossFlyKotlin Multiplatform
LanguageJavaKotlin
RuntimeNative binaries (JVM heritage)Native binaries (Kotlin/Native, JVM heritage)
What's sharedUI + logic, one codebaseLogic by default; UI native or via Compose MP
UI modelOne GPU-drawn UI everywhereNative per platform, or Compose MP (Skia)
iOS UI maturityCore frameworkCompose MP iOS stable since May 2025
iOS interopOne path, no ObjC bridgeKotlin↔Objective-C bridge (Swift via generated layer)
Build/toolingSingle JVM toolchainGradle-multiplatform + CocoaPods; iOS plugin macOS-only
Offline-firstCrossFly Sync (bidirectional)Assemble from libraries
DesktopFirst-class (Win/mac/Linux)Mature via Compose for Desktop
LicenseOpen source (Apache 2.0, Core)Open source (Apache 2.0)

Choose CrossFly when

Your team is on Java and doesn't want to standardise on Kotlin.
You want one shared UI across desktop and mobile, not per-platform UI work.
You'd rather avoid Kotlin/Native iOS interop and the Gradle/CocoaPods matrix.

Choose Kotlin Multiplatform when

You're a Kotlin/Android shop and want to share logic while keeping native UIs.
Per-platform native look and feel (SwiftUI/UIKit) is a priority.
You value JetBrains/Google backing and a large production track record.
The bottom line

Kotlin Multiplatform is a superb way for Kotlin and Android teams to share logic and keep native UIs, with JetBrains and Google behind it. The trade is that it's Kotlin-first, its iOS interop and shared UI carry real friction, and the build matrix is heavy. CrossFly makes a different bet: stay in Java, draw one UI on the GPU for every platform, and keep the toolchain simple. If your world is Java and you want one UI everywhere, CrossFly is the more direct path.

CrossFly vs Kotlin Multiplatform — FAQ

One language. One UI. Every platform.

Stay in Java, draw once on the GPU, and ship to Desktop (Windows, macOS and Linux), Android, iOS and the web (Chrome, Firefox, Safari and other browsers) — without the Kotlin/Native build matrix.

Start buildingSee all comparisons