Desidero fare alcune chiamate di servizio, modelli di dati, ecc. Da utilizzare come libreria sulle app iOS e Android, stavo pensando che forse Haxe è in grado di farlo ma non riesco a trovare alcun esempio. Qualcuno può far luce se è possibile e come iniziare?C'è un modo per creare una libreria in haxe che può essere chiamata nativamente su iOS e Android?
risposta
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:
- uso
java.Lib
funzioni di consumare tipi Java: http://api.haxe.org/java/Lib.html - uso
java.NativeArray
per rendere array Java: http://api.haxe.org/java/NativeArray.html
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 pacchettohaxe
.
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
}
});