簡體   English   中英

從同一代碼庫編譯J2ME和J2SE應用程序的最佳方法是什么?

[英]What is the best way to compile J2ME and J2SE apps from the same codebase?

我正在嘗試為J2ME和J2SE構建一個應用程序。 演示代碼顯然會有所不同,但我希望盡可能保持邏輯的共性。

我的計划是使用Ant或Antenna的預處理器來選擇J2ME或J2SE Graphics對象,該類是我的邏輯和顯示代碼之間的唯一交集。 我需要的是在Ant / Antenna構建任務期間在幾個文件中交換一行或兩行導入。

我想就如何設置這個問題提出一些建議。

我目前有兩個Eclipse項目,一個J2ME和一個J2SE。 關於如何設置預處理器,我有幾個想法:

  • 將J2SE代碼作為缺省值,並且僅預處理J2SE代碼以交換J2SE特定的導入
  • 對J2ME和J2SE項目使用Antenna預處理器
  • 使用Ant文本替換來進行必要的源修改

    一世。 看起來很難設置正確
    II。 感覺有點kludgy
    III。 看起來最不好,因為我認為自己不需要使用比一些條件導入更多的東西。

有沒有人有這種經歷? 一些建議將不勝感激。

兩個應用程序版本都有不同的啟動方式,對吧? 有一次它是一個MIDlet,另一次是一個帶有靜態main方法的Java類。 在那種情況下,我沒有看到使用預處理的要求。 兩個啟動實現都可以訪問公共代碼庫並移交J2ME或J2SE“graphics”對象,該對象實現公共代碼庫已知的接口。 這樣,公共代碼庫不需要知道實現細節,它只需要表示部分的接口。

BTW ..前段時間我有類似的情況,我覺得設置3個Eclipse項目,J2ME,J2SE和一個通用邏輯項目(技術上也是一個J2ME項目)更為舒服。 這有助於防止僅J2ME- / J2SE部分之間的類名沖突。

天線應該適用於大多數情況。 為J2SE和J2ME使用單一源代碼的優點是,您可以從源代碼的維護中獲得保存,並且還可以消除錯誤蔓延的可能性。我也有類似的問題,但我必須編寫一個適合的自定義預處理器我的需要。 但是對於大多數用途,天線可以很好地完成工作

編輯:示例構建文件

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

希望這可以幫助!

我做過一次所有的j2me庫都被我自己的假貨取代了。 這些假貨會調用所有需要的j2se lib調用。

聽起來很多工作,但實際上很多調用是相似的,你可能沒有使用所有東西所以你只需要創建一小部分可用的j2me類

Endresult:源代碼幾乎不需要任何#ifdef東西

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM