2009-08-17 5 views
3

J'essaye de construire une application pour J2ME et J2SE. Le code de présentation sera évidemment différent, mais j'espère garder la logique commune, autant que possible.Quelle est la meilleure façon de compiler les applications J2ME et J2SE à partir de la même base de code?

Mon plan consiste à utiliser le préprocesseur Ant ou Antenna pour sélectionner l'objet J2ME ou J2SE Graphics, cette classe étant la seule intersection entre ma logique et le code d'affichage. Tout ce dont j'ai besoin est d'échanger une ligne ou deux d'importations dans quelques fichiers au cours de ma tâche de construction Ant/Antenna.

Je voudrais des conseils sur la façon d'obtenir cette configuration.

J'ai actuellement deux projets Eclipse, un J2ME et un J2SE. J'ai quelques idées sur la façon dont je pourrais mettre en place le préprocesseur:

  • ont le code J2SE la valeur par défaut, et seulement prétraiter le code J2SE d'échanger des importations spécifiques J2SE
  • Utilisez le préprocesseur d'antenne pour les deux les projets J2ME et J2SE
  • Utiliser la substitution de texte Ant pour apporter les modifications nécessaires à la source

    i. semble difficile à mettre en place droite
    ii. se sent un peu kludgy
    iii. semble moins mauvais, parce que je ne me vois jamais avoir besoin d'utiliser beaucoup plus que quelques importations conditionnelles.

Est-ce que quelqu'un a déjà eu l'expérience de ce genre de choses? Certains conseils seraient très appréciés.

Répondre

3

Les deux versions de l'application ont différentes façons de démarrer, non? Une fois c'est un MIDlet et l'autre fois une classe Java avec une méthode principale statique. Dans ce cas, je ne vois pas l'obligation d'utiliser le prétraitement. Les deux implémentations de démarrage peuvent accéder à la base de code commune et remettre l'objet "graphics" J2ME ou J2SE qui implémente une interface connue de la base de code commune. De cette façon, la base de code commune n'a pas besoin de connaître les détails d'implémentation, elle a seulement besoin de l'interface pour la partie de représentation.

BTW .. J'avais une situation similaire il y a quelque temps et je me sentais plus à l'aise avec la configuration de 3 projets Eclipse, un J2ME, un J2SE et un projet logique commun (techniquement aussi un projet J2ME). Cela permet d'éviter les conflits de nom de classe entre les parties J2ME-/J2SE uniquement.

+0

Cela s'est avéré être la meilleure option pour moi - j'avais juste besoin d'échanger les objets J2ME et J2SE Graphics, j'ai donc implémenté une interface qui enveloppe cet objet. J'ai également une interface simple à chaque intersection de code commun et spécifique à la plate-forme, comme vous l'avez suggéré. Merci pour la suggestion! – Symmetric

1

L'antenne devrait fonctionner dans la plupart des cas. L'avantage d'utiliser une source unique pour J2SE et J2ME est que vous êtes sauvé de la maintenance du code source et vous éliminez également la possibilité de voir apparaître des bogues. Moi aussi j'avais des problèmes similaires, mais j'ai dû écrire un préprocesseur personnalisé mon besoin. Mais pour la plupart des cas l'antenne fait le travail magnifiquement

Modifié: fichier build Exemple

<project name="SomeProject" default="buildJ2ME" basedir=".."> 
... 
... 
... 
    <taskdef name="jadUpdater" classname="net.jxta.j2me.tools.Jad" classpath="${lib.dir}/jxta-tools.jar"/> 
    <taskdef resource="proguard/ant/task.properties" classpath="${lib.dir}/proguard.jar" /> 
    <taskdef resource="antenna.properties" classpath="${lib.dir}/antenna-bin-1.0.2.jar" /> 

    <macrodef name="preprocess"> 
     <attribute name="source"/> 
     <attribute name="dest"/> 
     <attribute name="symbols"/> 
     <sequential> 
      <wtkpreprocess 
       version="2" 
       srcdir="@{source}" 
       destdir="@{dest}" 
       symbols="@{symbols}" 
       printsymbols="true"> 

      </wtkpreprocess> 
     </sequential> 
    </macrodef> 


    <target name="compile" depends="init"> 
     <copy todir="${temp.dir}/src" > 
      <fileset dir="${src.dir}"/> 
     </copy> 

     <preprocess source="${temp.dir}/src" dest="${temp.dir}/preprocessed" symbols="${symbols}"/> 

     <javac srcdir="${temp.dir}/preprocessed" 
       destdir="${temp.dir}/classes" 
       bootclasspath="${bootclasspath}" 
       classpath="${lib.dir}" 
       debug="off" 
       source="1.3" 
       target="1.1" /> 

     <antcall target="jarForObfuscate"/> 
    </target> 

    <target name="buildJ2ME" depends="clean"> 
     <property name="symbols" value="J2ME1,J2ME2"/> 
     <antcall target="compile"/> 
    </target> 

    <target name="buildJ2SE"> 
     <property name="symbols" value="J2SE1,J2SE2"/> 
     <antcall target="compile"/> 
    </target> 
... 
... 
... 

</project> 

Hope this helps!

+0

Donc, vous comptez utiliser Antenna pour créer les projets J2SE? Existe-t-il un moyen de traiter les définitions de style d'antenne dans Eclipse, dans un projet J2ME? Je voudrais que le code J2ME soit commenté pendant que je suis en train d'éditer, mais autant que je sache, Eclipse ne peut le faire que dans les projets J2ME. – Symmetric

+0

Je suggère que vous utilisiez un fichier de construction de fourmis avec une tâche d'antenne comme cible, plutôt que de dépendre d'Eclipse. Je sais que l'écriture d'un fichier de construction de fourmi peut prendre un certain temps, mais vous ne l'écrivez qu'une seule fois et cela vous facilite la vie aussi. J'ai posté un exemple de fichier de construction dans la réponse éditée. – Ram

0

Je l'ai fait une fois avec toutes les bibliothèques j2me remplacées par mes propres contrefaçons. Ces faux appelleraient tous les appels j2se lib nécessaires.

Sonne comme beaucoup de travail, mais en fait beaucoup d'appels sont similaires, et vous êtes probablement ne pas utiliser tout pour vous suffit de créer un petit sous-ensemble des classes J2ME disponibles

EndResult: code source qui Vous n'avez pas besoin de trucs #ifdef

Questions connexes