3

J2ME と J2SE の両方のアプリを構築しようとしています。プレゼンテーション コードは明らかに異なりますが、ロジックはできるだけ共通に保ちたいと考えています。

私の計画は、Ant または Antenna のプリプロセッサを使用して、J2ME または J2SE Graphics オブジェクトのいずれかを選択し、そのクラスが私のロジックと表示コードの間の唯一の共通部分になるようにすることです。必要なのは、Ant/Antenna のビルド タスク中にいくつかのファイルで 1 行または 2 行のインポートを交換することだけです。

この設定方法についてアドバイスをいただきたいです。

私は現在、J2ME と J2SE の 2 つの Eclipse プロジェクトを持っています。プリプロセッサをセットアップする方法について、いくつかのアイデアがあります。

  • J2SE コードをデフォルトにし、J2SE コードのみを前処理して、J2SE 固有のインポートをスワップします。

  • J2ME プロジェクトと J2SE プロジェクトの両方にアンテナ プリプロセッサを使用する

  • Ant テキスト置換を使用して、必要なソース変更を行います

    私。正しく設定するのが難しい
    ii. 少しぎこちなく感じる
    iii. いくつかの条件付きインポートよりもはるかに多くを使用する必要があるとは思わないので、それほど悪くはないようです。

誰もこのようなことを経験したことがありますか?アドバイスをいただければ幸いです。

4

3 に答える 3

3

どちらのバージョンのアプリも、起動方法が異なりますよね? 1 つは MIDlet で、もう 1 つは静的なメイン メソッドを持つ Java クラスです。その場合、前処理を使用する必要はありません。どちらのスタートアップ実装も、共通コード ベースにアクセスし、共通コード ベースに認識されているインターフェイスを実装する J2ME または J2SE の「グラフィック」オブジェクトを引き渡すことができます。このように、共通コード ベースは実装の詳細を知る必要はなく、表現部分のインターフェイスだけが必要です。

ところで..私は少し前に同様の状況にあり、J2ME、J2SE、および共通ロジック プロジェクト (技術的には J2ME プロジェクト) の 3 つの Eclipse プロジェクトをセットアップする方が快適だと感じました。これにより、J2ME-/J2SE-only パーツ間のクラス名の競合を防ぐことができます。

于 2009-08-18T15:15:28.047 に答える
1

ほとんどの場合、アンテナで十分です。J2SE と J2ME の両方に 1 つのソースを使用する利点は、ソース コードのメンテナンスから解放され、バグが忍び寄る可能性を排除できることです。私も同様の問題を抱えていましたが、適切なカスタム プリプロセッサを作成する必要がありました。私の必要性。しかし、ほとんどの場合、アンテナは見事に機能します

編集:サンプルビルドファイル

<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>

お役に立てれば!

于 2009-08-18T06:15:30.843 に答える
0

私は、すべてのj2meライブラリを自分の偽物に置き換えて一度実行しました。これらの偽物は、必要なすべてのj2selib呼び出しを呼び出します。

多くの作業のように聞こえますが、実際には多くの呼び出しが類似しており、おそらくすべてを使用しているわけではないため、使用可能なj2meクラスの小さなサブセットを作成するだけで済みます。

最終結果:#ifdefのものをほとんど必要としないソースコード

于 2009-08-22T17:50:32.687 に答える