<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/61"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/61/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/61/atom/feed</id>
  <updated>2007-10-20T00:35:54+02:00</updated>
  <entry>
    <title>Développer en Java sous pdaXrom</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/61" />
    <id>http://artisan.karma-lab.net/node/61</id>
    <published>2006-10-21T19:21:00+02:00</published>
    <updated>2007-10-20T00:35:54+02:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Zaurus" />
    <category term="Aucun" />
    <category term="javafr" />
    <category term="OK" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Dans la mesure où Java est mon langage fétiche, il fallait que je vois ce que cela donne avec le Zaurus... L'objectif (il en faut toujours un) est déjà bien sur de voir si Java est compatible avec cette petite plate-forme et, dans un second temps, tenter de faire un petit lecteur de média en combinant une interface graphique et l'excellent mplayer.
</p>    ]]></summary>
    <content type="html"><![CDATA[<p>
  Dans la mesure où Java est mon langage fétiche, il fallait que je vois ce que cela donne avec le Zaurus... L'objectif (il en faut toujours un) est déjà bien sur de voir si Java est compatible avec cette petite plate-forme et, dans un second temps, tenter de faire un petit lecteur de média en combinant une interface graphique et l'excellent mplayer.
</p> <!-- break -->


	<a name='chapter_1'></a>
  <h2>Trois mots sur Java</h2>
	
<p>
  Il en va de java pour le monde embarqué comme des autres langages. Il est possible soit de compiler directement sur la plateforme (le Zaurus), soit d'effectuer ce travail sur une machine plus puissante (une machine de bureau) et de n'exécuter que le binaire sur le module embarqué. Pour info, il existe un compilateur de bytecode java que l'on trouve dans les contributions (jikes) mais j'avoue ne pas bien voir l'intérêt et de loin préférer tout compiler sur une machine plus puissante. Cette stratégie est d'autant plus crédible que l'aspect multi-plateforme de Java permet d'oublier facilement à quelle machine le binaire est destiné.
</p>

<p>
  Pour comprendre comment fonctionne Java il faut distinguer trois aspects : Le langage Java , La machine Virtuelle Java (ou JVM) et les librairies de fonctions Java (ou JDK). 
</p>
<p>Le langage Java est un langage Objet. Tout ou presque en Java est objet. Sa syntaxe est héritée du C (et pas de C++) et a été conçue pour un maximum de lisibilité. Tout ce que l'on imagine d'un langage moderne est présent dans Java : héritages, interfaçage, exceptions,prototypes, etc... Les seules choses qui ont été exclues sont celle qui, de l'avis des concepteur du langage, compromettent la stabilité de la structure (ex. héritages multiples). 
<p>La machine virtuelle Java exécute le bytecode issue de la compilation du langage. Pour comprendre à quel point cette machine est indépendante du langage il suffit de regarder du côté de dotNet. Si C# est le langage de prédilection sur cette plateforme, l'éditeur propose aussi un compilateur Java qui fournit un bytecode exécutable sur une machine virtuelle dotNet. Il existe aussi des traducteurs qui permettent de lancer le bytecode dotNet sur une machine virtuelle Java. On peut même imaginer écrire en assembleur JVM sans passer par Java. Ces deux choses sont donc bel et bien indépendantes. </p>
<p>Les librairies java, appelé le JDK. Ce sont l'ensemble (très volumineux) de classes utilitaires fournis au développeur pour accéllerer son oeuvre. Il y a de tout là dedans, de l'interface graphique (nous y reviendrons) aux structures de stockages (tables de hashage, vecteurs, etc.) en passant par la gestion de la vidéo, de la 3D, du réseau, etc...</p>
<p>Sun étant en quelque sorte le mainteneur de Java, les 3 composants que je viens de citer sont généralement marqués d'un numéro de version commun. Par exemple Java 1.5 fait référence à l'évolution 1.5 du langage (apportant les prototypes et les annotations), l'évolution 1.5 de la machine virtuelle et de son langage bytecode (beaucoup plus rapide) et l'évolution du JDK 1.5 avec de nouvelles fonctions et librairies.</p>
<p>Mais comme, et c'est ce qui va nous intéresser pour le Zaurus, ces composants sont indépendant, on peut fort bien imaginer utiliser les librairies d'un éditeur tiers, la JVM d'un autre en compilant notre code Java avec le compilateur de Sun. Tant que chacun respecte les numéros de version et les spécifications associées, tout doit bien se passer.</p>
<p>Donc si nous allons, sur notre PC, compiler nous sources avec les paquets de Sun, sur le Zaurus, il seront exécuté par la machine virtuelle libre JamVM et les librairies libres GNU/Classpath. Et tout ce petit monde, nous allons le voire, va marcher en cadence.</p>


	<a name='chapter_2'></a>
  <h2>Discussion sur les performances</h2>
	
<p>
  Java joui d'une mauvaise réputation en terme de performances, ce qui est sommes toute ridicule. Java se classe dans la catégorie des langages semi-interprétés (bytecode exécuté dans une JVM). Ce n'est donc pas lent comme du Basic qui est interprété à partir du source lui-même mais évidement plus lent (en encore <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> que du C compilé directement assimilable par le micro processeur.</p>
<p>Dans la catégorie des langages semi-interprétés nous avons d'autres concurrents comme Python (en mode pyc) et dotNet. Et étant de la même catégorie, n'en déplaise aux esprits chagrins, les performances sont en moyenne les mêmes. Par exemple une application lancée avec un jdk 1.5 est exactement la même qu'une dotnet 2.0 équivalente (c'en est troublant d'ailleurs). En revanche, une fois lançée, une application Java est, d'experience, beaucoup plus rapide qu'une application Python mais consomme un peu plus de mémoire. Enfin une application Java sera en moyenne toujours, 2.5 fois plus lente qu'une appli en C compilée avec GCC (optimisation O2) mais aura exactement les mêmes performances qu'une application en C sans optimization. 
</p>
<p>
  En terme d'occupation mémoire aussi les choses sont comparables. J'ai comparé avec pmem une application python et son équivalent Java et l'occupation se bat à 1Mo près (en faveur de Python). 
</p>
<p>
  Bref, utiliser un semi-interprété présente l'avantage d'un langage souvent plus évolué (dit langages managés), de plus de facilités de développement, mais aussi a un coût en performances quel que soit le langage choisi. Une fois ceci dit, j'avoue largement préférer un langage Java que je trouve plus mature qu'un dotnet (je n'ai pas testé dotNet après la 1.1) ou Python. Mais ce n'est qu'une histoire de goûts. 
</p>


	<a name='chapter_3'></a>
  <h2>Préparation du PC</h2>
	
<p>
  La première chose à installer est donc le J2EE (pour Java 2 Entreprise Edition) 1.5 release 6 à partir du site <a class='external' target='_blank' href='http://www.javasoft.com' >JavaSoft (Sun)</a> ainsi que l'excellent EDI, <a class='external' target='_blank' href='http://www.eclipse.org' >Eclipse 3.2</a>. 
</p>  
<p>
  Nous pourrions évidement écrire nos applications Java avec un simple NotePad mais ce n'est pas bien pratique et la plate-forme de développement <kbd>Eclipse</kbd> semble plus indiqué pour ce type d'opération. Pour ceux qui ne connaissent pas, Eclipse est un projet libre initié (et offert) par IBM, destiné à construire un environnement de développement ultra-complet. Et même si ce projet était originellement destiné à Java, il est aujourd'hui capable de prendre en charge à peu prés tous les langages : C, Python, php, dotnet, etc... Eclipse peut aussi être mis en oeuvre facilement sur de nombreuses plate-formes (y compris macOS).
</p>
<p>
  Une fois le J2EE et Eclipse installés, il suffit de lancer Eclipse et de créer le nouveau projet <kbd>ZaurusJava</kbd>. 
  <ol>
    <li><kbd>File</kbd>/<kbd>New</kbd>/<kbd>Project</kbd>/<kbd>JavaProject</kbd>, Appelezle <kbd>Zaurus</kbd> puis Finish</li>
  </ol>
  Avant d'aller plus loin, il convient de modifier les propriétés du projet pour qu'il utilise le JDK 1.4 et non pas le 1.5 qui nous sert à lancer Eclise :
  <ol>
    <li>Sélectionner le projet dans l'explorateur et clique-droit <kbd>Properties</kbd></li>
    <li>Aller en section <kbd>Java Build Path</kbd>, onglet <kbd>Source</kbd></li>
    <li>Cliquer sur <kbd>Add Folder</kbd> et tapez <kbd>Sources</kbd> puis valider</li>
    <li>Changer la valeur de <kbd>Default Output Folder</kbd> pour <kbd>zaurus/classes</kbd></li>
    <li>Aller dans l'onglet <kbd>Libraries</kbd>, SSélectionnezle <kbd>JDK 1.5</kbd> puis <kbd>Remove</kbd></li>
    <li>Cliquez sur <kbd>Add Library</kbd>, puis <kbd>Next</kbd>, puis <kbd>Alternate JRE</kbd>, <kbd>Installed JRE</kbd>, <kbd>Add</kbd>, et <kbd>Browse</kbd></li>
    <li>Sélectionner le chemin où se trouve le jdk 1.4 (sous linux en /usr/java/jdk1.4.2)</li>
    <li>Changer la valeur <kbd>jre Name</kbd> en jdk14 puis <kbd>OK</kbd> et encore <kbd>OK</kbd></li>
    <li>De retour sur <kbd>Alternate JRE</kbd>, sélectionnez le nouveau <kbd>jdk14</kbd> puis <kbd>Finish</kbd></li>
    <li>Aller dans la section <kbd>Java Compiler</kbd></li>
    <li>Cliquer sur <kbd>Enable Project Specific Settings</kbd></li>
    <lI>Modifier <kbd>Compiler Compliance Level</kbd> à la valeur <kbd>1.4</kbd></lI>
    <li>Valider par <kbd>OK</kbd></li>
  </ol>
  Voilà qui en fait, il suffit maintenant faire un click-droit dans l'explorateur Java sur la branche <kbd>sources</kbd> et sélectionner <kbd>new</kbd>/<kbd>Class</kbd>. Taper dans la zone <kbd>name</kbd> le nom <kbd>HelloWolkd</kbd> et cliquer sur <kbd>Finish</kbd>.  
</p>
<p>
  A ce stade, vous avez un squelette de la classe HelloWorld dans l'éditeur. On va le modifier pour afficher la bienvenue chère à nos vieux amis Kernighan et Ritchie. Pour corser la tache de la JVM et vérifier par le fait la compatibilité avec les dernières extension du langage Java, nous allons faire le HelloWord le plus idiot du monde, sous forme de prototype :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">class</span> HelloWorld<br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw1">class</span> SayWhatEver<span class="sy0">&lt;</span>E<span class="sy0">&gt;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> E content<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SayWhatEver<span class="br0">&#40;</span>E value<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; content<span class="sy0">=</span>value<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> sayIt<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span>content<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; SayWhatEver<span class="sy0">&lt;</span>String<span class="sy0">&gt;</span> t <span class="sy0">=</span> <span class="kw1">new</span> SayWhatEver<span class="sy0">&lt;</span>String<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="st0">&quot;Hello World!!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; t.<span class="me1">sayIt</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
  </div>
  
  </div>
  Pour vérifier que tout fonctionne, dans l'explorateur Java, cliquer droit sur le fichier <kbd>HelloWorld.java</kbd> et sélectionnez <kbd>run as</kbd> puis <kbd>Java Application</kbd>. Le message de bienvenue doit s'afficher dans la console en dessous de l'éditeur. Fin de la première étape.  
</p>


	<a name='chapter_4'></a>
  <h2>Paramétrage du Zaurus</h2>
	
<p>
  Côté Zaurus, un contributeur, Cortez, que je félicite au passage, a compilé pour pdaXrom la librairie GNU/Java <a class='external' target='_blank' href='http://www.gnu.org/software/classpath/' >Classpath</a> et la machine virtuelle <a class='external' target='_blank' href='http://jamvm.sourceforge.net/' >JamVM</a>. Classpath est un projet GNU qui c'est fixé comme objectif de fournir une implémentation libre de l'ensemble des classes de base du JDK de Sun. Cela peut paraître idiot de tout refaire ainsi mais c'est loin d'être le cas pour des raisons de licences que je n'approfondirais pas ici.
</p>
<p>
  JamVM est quant à elle une extraordinaire petite machine virtuelle Java dont la taille d'exécutable frise le ridicule (110ko sur une plateforme Intel).</p>

<p>
  Ceci fait vous pouvez vérifier que la vm est installé en tapant
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  jamvm -h
  </div>
  
  </div>
</p>
  Tout vas bien donc, sinon, il faut me prévenir car j'aurais surement fait une erreur dans la création du paquet <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/>
</p>
<p>
  Il faut maintenant remonter le binaire HelloWorld compilé par Eclipse sur le Zaurus pour tester tout cela. Comme nous l'avons paramétré, tous les binaires compilés par Eclipse sont sur votre PC dans le dossier <kbd>zaurus/classes</kbd>. Il suffit donc de recopier ce dossier sur une SD et de la mettre dans le Zaurus. Une autre méthode plus rapide consiste à utiliser ssh en tapant :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://pwet.fr/man/linux/commandes/scp"><span class="kw2">scp</span></a> -r <span class="sy0">/</span>home<span class="sy0">/</span>mon_home<span class="sy0">/</span>workspace<span class="sy0">/</span>zaurus<span class="sy0">/</span>classes root<span class="sy0">@</span>zaurus:<span class="sy0">/</span>mnt<span class="sy0">/</span>card
  </div>
  
  </div>
  Cela me permet de recopier rapidement tous les fichiers compilés sur la SD insérée dans le le Zaurus. 
</p>
<p>
  D'une manière ou d'une autre, votre dossier <kbd>classes</kbd> est sur la SD en <kbd>/mnt/card/classes</kbd>. Normalement il y a un deux fichiers dans ce dossier, le java compile <kbd>HelloWorld.class</kbd> et celui de sa classe interne. Pour l'exécuter tapons "simplement" :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="sy0">/</span>usr<span class="sy0">/</span>java<span class="sy0">/</span>jamvm<span class="sy0">/</span>bin<span class="sy0">/</span>jamvm -cp <span class="sy0">/</span>mnt<span class="sy0">/</span>card<span class="sy0">/</span>classes HelloWorld
  </div>
  
  </div>
  <pre class='sample'>Hello World !!!</pre>
  C'est gagné <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/smile.gif" title="Smiling" alt="Smiling" class="smiley-content"/> Un premier pas de fait et la vérification au passage de la compatibilité avec la norme 1.5 du langage, en tout cas pour les prototypes ce qui est déjà plus que pas mal !</p>
<p>Maintenant ajoutons la couche graphique à cet édifice bien prometteur...</p>
</p>

	<a name='chapter_5'></a>
  <h2>Premier essai en SWING</h2>
	
<p>
  Il y a 3 toolkit graphique sous Java. AWT, l'ancêtre dont le crédo est "le plus petit dénominateur commun". AWT ne connaît donc que les composants qui existent sur toutes les platef-ormes (X11, Windows et Mac OS). N'y cherchez par exemple pas de composant "arborescence", il n'y en a pas. En revanche c'est très rapide car ce sont directement les composants natif qui sont affichés.</p>
<p>Fort de cette pauvreté est apparu JFC (Java Foundation Classes) qui jette les bases de composants graphiques entièrement écrits en Java. Cela va s'appeler plus tard SWING et être intégré aux J2EE 1.3. C'est très beau, très très riche et complet mais aussi très lent. Car chaque pixel de chaque bouton est écrit en Java, en bytecode donc, en interprété quoi... Au fil des versions Swing a prodigieusement gagné en vitesse. Aujourd'hui, sans sa version 1.6, Swing est très abouti et parfaitement utilisable pour une machine un tant soit peu puissante. Mais il reste à mon sens un peu trop lourd pour notre pauvre Zaurus. </p>
<p>Dernière arrivé, SWT se veut la synthèse, le meilleur des deux mondes. Son crédo c'est utiliser le natif à chaque fois que possible, sinon, au pire cas, émuler en java. L'IHM d'Eclipse est écrite en SWT. Les SWT reposent sur des wrappers qui encapsulent des toolkits natif comme Win32, GTK ou Quartz. C'est très léger et c'est surtout très rapide. 
<p>
  Commençons donc par SWING, pour déjà voir si notre VM sais ce que c'est qu'une fenêtre. Nous allons modifier notre HelloWorld sous Eclipse :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw1">import</span> <span class="co2">java.awt.Dimension</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.awt.event.ActionEvent</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">java.awt.event.ActionListener</span><span class="sy0">;</span><br />
<br />
<span class="kw1">import</span> <span class="co2">javax.swing.JButton</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">javax.swing.JFrame</span><span class="sy0">;</span><br />
<br />
<span class="kw1">public</span> <span class="kw1">class</span> HelloWorld<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AJFrame+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">JFrame</span></a> frame <span class="sy0">=</span> <span class="kw1">new</span> <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AJFrame+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">JFrame</span></a><span class="br0">&#40;</span><span class="st0">&quot;Hello World&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AJButton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">JButton</span></a> button <span class="sy0">=</span> <span class="kw1">new</span> <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AJButton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">JButton</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; button.<span class="me1">setText</span><span class="br0">&#40;</span><span class="st0">&quot;Quitter&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; button.<span class="me1">addActionListener</span><span class="br0">&#40;</span><span class="kw1">new</span> <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AActionListener+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ActionListener</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> actionPerformed<span class="br0">&#40;</span><a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AActionEvent+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ActionEvent</span></a> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;bye bye&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; frame.<span class="me1">getContentPane</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">add</span><span class="br0">&#40;</span>button<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; frame.<span class="me1">setSize</span><span class="br0">&#40;</span><span class="kw1">new</span> <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3ADimension+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Dimension</span></a><span class="br0">&#40;</span><span class="nu0">100</span>,<span class="nu0">30</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; frame.<span class="me1">setVisible</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>
  </div>
  
  </div>
</p>
<p>
<image id="1"/>
Même procédure que pour le précédent exemple, on compile et exécute sous Eclipse pour vérifier que tout fonctionne, et on transporte <kbd>classes</kbd> sur le Zaurus pour vérifier que tout se passe sans problèmes. C'est déjà un très bon point...
</p>


	<a name='chapter_6'></a>
  <h2>Passage à SWT</h2>
	

<p>
<image id="2"/>
  Mon HelloWorld en Swing met près de 2 secondes de plus à se lancer que son équivalent Python (avec pyGtk). Et une fois lancer, la version Swing répond beaucoup moins bien (latence). La raison en est simple, Swing dessine absolument tous les composants en Java alors que PyGtk se "contente" de transférer la gestion des contrôles à des libraires GTK natives. On ne boxe pas dans la même catégorie et pour le Zaurus, c'est un problème auquel il faut trouver une solution. SWT semblerait donc bien plus indiqué. 
</p>



<p>Une fois installé sur le Zaurus, les fichiers .so natifs sont en <kbd>/usr/lib/swt</kbd> et le fichier <kbd>swt.jar</kbd> en <kbd>/usr/java/swt</kbd>. Modifions maintenant sous éclipse notre HelloWorld pour le mettre à la sauce SWT :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw1">import</span> <span class="co2">org.eclipse.swt.SWT</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.swt.events.SelectionAdapter</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.swt.events.SelectionEvent</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.swt.widgets.Button</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.swt.widgets.Display</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.swt.widgets.Shell</span><span class="sy0">;</span><br />
<br />
<span class="kw1">public</span> <span class="kw1">class</span> HelloWorld<br />
<span class="br0">&#123;</span><br />
&nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="kw1">throws</span> <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a><br />
&nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; Display display <span class="sy0">=</span> <span class="kw1">new</span> Display<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; Shell shell <span class="sy0">=</span> <span class="kw1">new</span> Shell<span class="br0">&#40;</span>display<span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AButton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Button</span></a> button1 <span class="sy0">=</span> <span class="kw1">new</span> <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3AButton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Button</span></a><span class="br0">&#40;</span>shell,SWT.<span class="me1">PUSH</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; button1.<span class="me1">setText</span><span class="br0">&#40;</span><span class="st0">&quot;Hello World from Zaurus/SWT !!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; button1.<span class="me1">setLocation</span><span class="br0">&#40;</span><span class="nu0">0</span>,<span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; button1.<span class="me1">setSize</span><span class="br0">&#40;</span><span class="nu0">230</span>,<span class="nu0">30</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; button1.<span class="me1">addSelectionListener</span><span class="br0">&#40;</span><span class="kw1">new</span> SelectionAdapter<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> widgetSelected<span class="br0">&#40;</span>SelectionEvent e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Hello world here too !!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; shell.<span class="me1">pack</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; shell.<span class="me1">open</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>shell.<span class="me1">isDisposed</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy0">!</span>display.<span class="me1">readAndDispatch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; display.<span class="me1">sleep</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; display.<span class="me1">dispose</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Goodbye World...&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>
  </div>
  
  </div>
</p>
<p>
  Nous pouvons tester cette nouvelle mouture sous Eclipse en modifiant un peu notre projet pour qu'il prenne en charge SWT. Pour cela il faut aller dans les propriétés du projets (voir plus haut) et dans la section <kbd>Java Build Path</kbd>, onglet <kbd>Libraries</kbd> pour cliquer sur <kbd>Add External Jars...</kbd> et rechercher dans le dossier d'installtion d'éclipse et son sous dossier <kbd>plugin</kbd> un fichier .jar de la forme <kbd>org.eclipse.swt.XXX</kbd> avec XXX correspondant à votre plateforme (linux.x86_3.1.1 pour un linux, j'imagine un win32 quelque chose pour Windows, etc...). Ceci fait, Valider les propriétés du projet et lancez votre application en cliquant-droit sur HelloWorld.java et en sélectionnant <kbd>run as</kbd>/<kbd>SWT Application</kbd>.
</p>
<p>
  Si tout c'est bien passé, il faut, comme toujours, transférer le dossier <kbd>classes</kbd> sur la SD et lancer sur le Zaurus en précisant cette fois les accès aux librairies SWT :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  jamvm -cp <span class="sy0">/</span>usr<span class="sy0">/</span>java<span class="sy0">/</span>swt<span class="sy0">/</span>swt.jar:<span class="sy0">/</span>mnt<span class="sy0">/</span>card<span class="sy0">/</span>classes -Djava.library.<span class="re2">path=</span><span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>swt HelloWorld
  </div>
  
  </div>
</p>
  A ce point vous devez avoir un HelloWorld en SWT qui fonctionne. 
</p>
<p>  La référence <kbd>/usr/lib/swt</kbd> peut-être éliminée en plaçant dans le fichier <kbd>/etc/profile</kbd>, à la fin :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw3">export</span> <span class="re2">LD_LIBRARY_PATH=</span><span class="re1">$LD_LIBRARY_PATH</span>:<span class="sy0">/</span>usr<span class="sy0">/</span>lib<span class="sy0">/</span>swt
  </div>
  
  </div>
</p>
<p>
  Ainsi, à votre prochaine connection (ou reboot, ou en tapant <kbd>. /etc/profile</kbd>) la syntaxe sera grandement simplifiée :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  jamvm -cp <span class="sy0">/</span>usr<span class="sy0">/</span>java<span class="sy0">/</span>swt<span class="sy0">/</span>swt.jar:<span class="sy0">/</span>mnt<span class="sy0">/</span>card<span class="sy0">/</span>classes HelloWorld
  </div>
  
  </div>
</p>


	<a name='chapter_7'></a>
  <h2>Conclusion</h2>
	
<p>
  La première chose que l'on note à ce stade c'est la vitesse d'exécution. Alors qu'en Swing mon HelloWorld s'affiche en 7 seconde, contre 5 secondes pour Python, cela ne met plus que 4 secondes dans cette nouvelle mouture.
</p>
<p>
Pour compléter ce test j'ai essayé le toolkit fltk, censé être le plus rapide. Il est natif et l'application s'écrit en C++. l'ensemble se cross-compile très facilement et fonctionne très bien sur le Zaurus, éditeur d'écran compris (Nommé FLUID), et en version 1.x ou 2. Et un constat s'impose, le temps de chargement bât tout les records. 2 secondes pas plus pour notre HelloWorld. C'est très encourageant à un détail près, le look de fltk est juste atroce et jure avec le reste du bureau. En fltk2 c'est un peu mieux et les développeurs nous promettent des styles GTK. Mais s'agira t'il d'un wrapper ou d'un simple thème ? Bref,pour l'instant c'est sur, c'est rapide mais cela ne balance pas suffisamment la rudesse d'un développement en C++ et la laideur du résultat. 
</p>
<p>Pour l'instant, je reste donc sur la plate-forme Java. Nous bénéficions ici d'un environnement mature et ultra riche. L'exécution en elle-même est très compétitive et ce n'est que le temps de chargement qui diffère réellement avec le natif. En revanche, comparé à Python, il n'y a juste pas photo...
</p>


    ]]></content>
  </entry>
</feed>
