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