2016-02-12 9 views

risposta

8

Questo è un argomento molto importante ed è possibile. Tuttavia è probabile che dovrai esporre API specifiche dell'host perché Java e Objective-C/C++ hanno tipi nativi diversi.

Per iOS, è possibile trovare un inizio di risposta qui: How to create iOS- & OSX- library from Haxe and use it in native application?

Per Android è abbastanza semplice per esporre un'API seguendo il solito schema di interfaccia ascoltatore. Ma generalmente non è possibile passare i riferimenti alle funzioni in Java, quindi Haxe-java utilizza un modello simile generalizzato usando oggetti Closure/Function che sono scomodi da usare da Java.

Scrivi codice Haxe per Java:

Assicurarsi di aggiungere @:nativeGen meta per tutte le classi esposte - Haxe riflessione non funzionerà, ma sarà più pulita quando consumati da Java.

package com.foo; 

@:nativeGen 
class MyModel { 
    public function new() { 
    } 
    public function doSomething(listener:SomethingListener) { 
     Timer.delay(function() { 
      listener.onResult(cpt); 
     }, 2000); 
    } 
} 

@:nativeGen 
interface SomethingListener { 
    function onResult(value:Int):Void; 
} 

Le basi sono semplici, ma il diavolo è nei dettagli: per consumare/ritorno Java tipi nativi si dovrà fare un certo lavoro di conversione:

Ge nerate un JAR da Haxe:

# generates java source under /MyAPI and a corresponding /MyAPI/MyAPI.jar 
haxe -cp src -java MyAPI -D no-root com.foo.MyModel 

Note:

  • -main è omesso perché non vogliamo che un punto di ingresso statica
  • -D no-root genererà un pacchetto nativo aspetto, altrimenti le cose sono sotto il pacchetto haxe.

Sul lato Java:

È possibile importare questo JAR e utilizzarlo in modo trasparente.

Da IntelliJ/Android Studio è possibile creare un modulo: Struttura del progetto> Aggiungi modulo> Importa pacchetto JAR/AAR.

È importante notare che IntelliJ copia il JAR all'interno del progetto, quindi è necessario aggiornare il JAR lì quando si ricostruisce il progetto Haxe. IntelliJ raccoglierà le modifiche immediatamente.

import com.foo.MyModel; 
import com.foo.SomethingListener; 

MyModel myModel = new MyModel(); 
myModel.doSomething(new SomethingListener() { 
    @Override 
    public void onResult(int value) { 
     // Got something from Haxe 
    } 
});