3

我正在尝试为 J2ME 和 J2SE 构建一个应用程序。演示代码显然会有所不同,但我希望尽可能保持逻辑通用。

我的计划是使用 Ant 或 Antenna 的预处理器来选择 J2ME 或 J2SE 图形对象,该类是我的逻辑和显示代码之间的唯一交集。我所需要的只是在我的 Ant/Antenna 构建任务期间在几个文件中交换一两行导入。

我想要一些关于如何设置的建议。

我目前有两个 Eclipse 项目,一个 J2ME 和一个 J2SE。对于如何设置预处理器,我有几个想法:

  • 将 J2SE 代码设为默认值,并且仅预处理 J2SE 代码以交换 J2SE 特定的导入

  • 对 J2ME 和 J2SE 项目使用 Antenna 预处理器

  • 使用 Ant 文本替换来进行必要的源代码修改

    一世。看起来很难正确设置
    ii。感觉有点笨拙
    iii. 似乎最不坏,因为我认为自己不需要使用比几个条件导入更多的东西。

有没有人有过这种事情的经验?一些建议将不胜感激。

4

3 回答 3

3

两个应用程序版本都有不同的启动方式,对吧?一次是 MIDlet,另一次是具有静态 main 方法的 Java 类。在那种情况下,我看不到使用预处理的要求。两种启动实现都可以访问公共代码库并移交 J2ME 或 J2SE“图形”对象,该对象实现公共代码库已知的接口。这样通用代码库不需要知道实现细节,它只需要表示部分的接口。

顺便说一句 .. 前段时间我也遇到过类似的情况,我对设置 3 个 Eclipse 项目、一个 J2ME、一个 J2SE 和一个通用逻辑项目(技术上也是一个 J2ME 项目)感到更自在。这有助于防止 J2ME-/J2SE-only 部分之间的类名冲突。

于 2009-08-18T15:15:28.047 回答
1

在大多数情况下,天线应该可以。为 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>

希望这可以帮助!

于 2009-08-18T06:15:30.843 回答
0

我做过一次,所有的 j2me 库都被我自己的假货取代了。这些伪造品会调用所有需要的 j2se lib 调用。

听起来工作量很大,但实际上很多调用都是相似的,而且您可能没有使用所有东西,因此您只需要创建可用 j2me 类的一小部分

Endresult:几乎不需要任何#ifdef 东西的源代码

于 2009-08-22T17:50:32.687 回答