D'après Adobe ainsi que mes premières expériences d'utilisation du SDK, cette nouvelle version apporte les applications étendues qui disposent de la classe NativeProcess. Cette classe permet d'exécuter nativement des programmes sous forme de process (programmes Java par exemple). Les applications étendues peuvent être en plus publiées sous forme d'exécutables natif (.exe pour Windows et .dmg pour Mac).
Néanmoins je trouve que l'utilisation de processus natifs va vraiment donner plus de punch à cette technologie et encourager les éditeurs à l'adopter. La raison est que le monde java regorge de librairies (libres et payantes), ce qui va diminuer les temps de développement des projets. Sans oublier qu'on trouve plus d'experts en Java qu'en AIR (et flex en général).
D'abord voilà comment créer un projet sur Flash Builder 4 (ou Eclipse munit du plugin Flash Builder 4) qui puisse compiler du code flex et du code java :
D'abord voilà comment créer un projet sur Flash Builder 4 (ou Eclipse munit du plugin Flash Builder 4) qui puisse compiler du code flex et du code java :
- créer un projet Java, créer les classe ou les ajouter etc …
- ajouter le type ‘projet flex’ à ce projet. Pour cela il faut faire un clique droit sur le projet, aller sur ‘Ajouter/Modifier le type de projet’ puis cliquer sur ‘Ajouter un type de projet flex’.
Pour l’exécution d'un programme Java (par exemple) depuis l’application AIR (le code Action Script), il faut créer un objet de type NativeProcess et initialiser le chemin de la classe java ainsi que la JVM à l'aide d'un objet de type NativeProcessStartupInfo. Voilà les lignes de code les plus importantes pour ce faire :
var info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
info.workingDirectory = File.applicationDirectory;
var args:Vector.<String> = new Vector.<String>();
args.push("-cp","./src/source/bin","com.monpackage.maclasse");
info.arguments = args;
process = new NativeProcess();
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA,onDataOutput);
var info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
info.workingDirectory = File.applicationDirectory;
var args:Vector.<String> = new Vector.<String>();
args.push("-cp","./src/source/bin","com.monpackage.maclasse");
info.arguments = args;
process = new NativeProcess();
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA,onDataOutput);
Si vous voulez être sure de ne pas commettre d'erreurs (ou vous voulez que ça marche enfin :D), voilà une vidéo d'un des nombreux 'evangelist' d'Adobe qui explique pas à pas la création d’un projet AIR/Java et la programmation ActionScript pour l’éxécution d’un programme Java :
Si vous arrivez pas à lancer la vidéo, voici le lien sur Adobe TV : http://tv.adobe.com/watch/adobe-evangelists-piotr-walczyszyn/invoking-java-process-from-adobe-air-2-applications/
Si vous avez suivi la vidéo jusqu'à la fin, l'application AIR communique avec l'application Java à l'aide de flux entrant (STDIN) et de flux sortant (STDOUT).
Dans le test de la vidéo, rien de plus simple, on lance un programme Java (la méthode main) qui envoi des String et on les reçoit du coté AIR. Mais c'est au moment où j'ai voulu manipuler et échanger des tables (par exemple) entre AIR et Java que je me suis rendu compte de la limitation de cette solution, car il n'y pas de moyen d'échanger d'autre types de messages et surtout d'appeler naturellement (à la façon Java) la méthode Java qu'on veut au moment où on veut. J'ai donc commencé à chercher un moyen qui se rapproche le plus de la manière LCDS, c'est à dire d'avoir la possibilité de créer des espèces de remoteObject et de faire les appel puis d'attendre les résultats des appels, et pourquoi pas en passant la possibilité de faire du 'mapping' automatique entre les types AIR et les types Java.
Et effectivement je suis tombé sur deux projets de ce genre. Le premier Flerry qui est mené par un autre évangéliste d'Adobe. Il m'a parut plus adapté mais j'ai pas réussi à le faire marcher avec des listes. Enfin je n'ai pas encore essayé la dernière release hehe. Le deuxième est Merapi qui est plus ancien mais que j'ai pas encore testé.