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.

Native integration 🤖🍎🖥️

How the neutral Java code (in core) reaches OS features that vary by platform.

PlatformUtils — the single abstraction point

PlatformUtils.instance is the platform façade. Each launcher installs its implementation (the web installs PlatformUtilsWeb). Key methods:

IWebView wv = PlatformUtils.instance.createWebView();   // null where there is no webview (web)
PlatformUtils.instance.view(url);                        // opens external URL
PlatformUtils.instance.dial(numero);                     // dials

The crossfly-lib native library

Loaded at startup by SharedLibraryLoader.load("crossfly-lib") inside Main.create() — on all targets, except WebGL:

if (Gdx.app.getType() != Application.ApplicationType.WebGL)
   new SharedLibraryLoader().load("crossfly-lib");

For this reason, everything that depends on it (e.g., NativeImage via JNI) does not exist on the web — there the pure Java implementation (JavaImageOps) or the stub applies.

The “native feature with fallback” pattern

Always check before using a feature that may not exist:

if (PlatformUtils.instance.createWebView() != null) {
   WebContainer c = new WebContainer();     // Android/iOS/Desktop
   painel.add(LAY_FILL, c);
   c.show(url);
} else {
   PlatformUtils.instance.view(url);        // Web: opens externally
}

The same applies to null returns from camera/map and to Device.platform:

if (Device.platform.isDesktop()) { /* desktop path */ }

Writing your own native implementation

Concrete services (webview, GPS, etc.) live outside core, in each launcher. For a new feature, define the interface in core and implement it per launcher, installing it in PlatformUtils/a service field at startup. The image abstraction follows this model: ImageOps → JavaImageOps (JVM) vs NativeImage (JNI).

Best practices

  • Never assume a device feature exists — check != null/Device.platform.
  • Place OS-specific code in the launcher, not in core.

Common mistakes

  • Calling a native feature without a fallback (breaks on the web).
  • Expecting crossfly-lib/JNI on the web (it is not loaded on WebGL).

See also

Was this page helpful?