Saltar al contenido
CrossFly es 100% open sourceSíguenos en GitHub
CrossFlyCrossFly
Empezar

Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.

Integración nativa 🤖🍎🖥️

Cómo el código Java neutro (en core) alcanza recursos del SO que varían por plataforma.

PlatformUtils — el punto único de abstracción

PlatformUtils.instance es la fachada de plataforma. Cada launcher instala su implementación (el web instala PlatformUtilsWeb). Métodos clave:

IWebView wv = PlatformUtils.instance.createWebView();   // null donde no hay webview (web)
PlatformUtils.instance.view(url);                        // abre URL externa
PlatformUtils.instance.dial(numero);                     // marca

La biblioteca nativa crossfly-lib

Cargada en el arranque por SharedLibraryLoader.load("crossfly-lib") dentro de Main.create() — en todos los destinos, excepto WebGL:

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

Por eso, todo lo que depende de ella (ej.: NativeImage vía JNI) no existe en la web — allí vale la implementación Java pura (JavaImageOps) o el stub.

El patrón “recurso nativo con fallback”

Siempre comprueba antes de usar un recurso que puede no existir:

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: abre externamente
}

Lo mismo vale para los retornos null de cámara/mapa y para Device.platform:

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

Escribir una implementación nativa propia

Los servicios concretos (webview, GPS, etc.) viven fuera de core, en cada launcher. Para un recurso nuevo, define la interfaz en core e impleméntala por launcher, instalándola en PlatformUtils/campo de servicio en el arranque. La abstracción de imagen sigue este modelo: ImageOps → JavaImageOps (JVM) vs NativeImage (JNI).

Buenas prácticas

  • Nunca asumas que un recurso de dispositivo existe — comprueba != null/Device.platform.
  • Coloca el código específico del SO en el launcher, no en core.

Errores comunes

  • Llamar a un recurso nativo sin fallback (se rompe en la web).
  • Esperar crossfly-lib/JNI en la web (no se carga en WebGL).

Ver también

¿Te resultó útil esta página?