Len*_*mel 13 java portability cross-platform midp java-me
我正在尝试编写一个运行不同java平台的应用程序,如J2SE,J2ME,Android等.我已经知道我必须为每个平台重写大部分UI,但是想重用核心逻辑.
保持这个核心便携性涉及三个我所知道的缺点:
我知道如何克服(1):5.0风格的代码并自动将其转换为1.4(retroweaver - 尚未尝试过,但似乎没问题).
我认为(2)是一个我必须接受的问题.
现在我想知道(3)最好的工作环节是什么,特别是我最想念的收藏课程.我能想到这些:
Set,Map,List等,并退回到Vector朴素阵列.我认为这首先使代码变得丑陋.但我也知道正确的选择之间TreeSet/Hashset或LinkedList/ArrayList对性能至关重要,而且总是使用Vector和Arrays也不对.感谢您的回答和意见!
编辑:我终于找到了一个(复杂但很好)的解决方案,我想通过提供我自己的答案并接受它,解决方案将在顶部可见.但恰恰相反,我的答案仍处于最底层.
jjb*_*jjb 13
J2ME是残酷的,你只需要在没有其他平台的一些细节的情况下辞职.习惯Hashtable和Vector,并在这些上面编写自己的包装器.此外,不要错误地假设J2ME也是标准的,因为每个制造商的JVM都可以以完全不同的方式做事.我最初并不担心性能,因为只是在J2ME上获得正确性就足够了.可以编写一个运行在J2ME,J2SE和Android上的应用程序,就像我做的那样,但它需要做很多工作.我有一个建议是你编写应用程序逻辑的核心并严格遵守java.lang,java.util和java.io. 在您可能正在进行可能与平台交互的任何地方(例如文件系统或网络)的任何地方,您可以创建核心应用程序代码与之交互的接口,以便为不同的环境提供不同的实现.例如,您可以拥有一个包装HTTP内容的接口,并在Android上使用javax.microedition.io.HttpConnection和J2ME以及java.net.HttpURLConnection.这很痛苦,但是如果你想维护一个在所有这三个环境中运行的应用程序,它可以帮助你.祝好运.
Len*_*mel 12
自从我提出这个问题以来已经有一段时间了,而且自从我为这个问题找到了一个很好的,有效的解决方案之后,我就一直在告诉你.
我主要关注的是Java Collections Framework,它是该java.util软件包的一部分.
我终于采用了Suns Java 6.0的源代码,并将属于Collections框架的所有类复制到了我自己的项目中.这是一个Java 6.0项目,但我使用J2ME的jar作为classpath.我复制的大多数类依赖于其他J2SE类,因此存在破坏的依赖关系.无论如何,通过省略所有处理序列化的事情(这不是我的优先事项)和一些微小的调整,很容易削减这些依赖关系.
我使用Java 6编译器编译了整个内容,并使用反向转换器将生成的字节码移植回Java 1.2.
下一个问题是包名称,因为您无法java.util使用J2ME应用程序交付类并加载它们 - 引导类加载器不会查看应用程序jar文件,其他引导加载程序不允许使用该包加载某些内容name,在J2ME上,您无法定义自定义类加载器.逆向转换器不仅可以转换字节码,还有助于更改现有字节码中的名称引用.我不得不移动并重命名我项目中的所有类,例如java.util.TreeMap成为my.company.backport.java.util.TreeMap_.
我能够在第二个引用通常的Java 6.0项目中编写实际的J2ME应用程序java.util.TreeMap,使用通用语法创建类型安全的集合,将该应用程序编译为Java 6.0字节代码,并通过反向转换器运行它来创建Java 1.2代码现在引用my.company.backport.java.util.TreeMap_.请注意,这TreeMap只是一个示例,它实际上适用于整个集合框架,甚至适用于引用该框架的第三方J2SE JAR.
生成的应用程序可以打包为jar和jad文件,并且可以在J2ME模拟器和实际设备上运行(在索尼爱立信W880i上测试).
整个过程看起来相当复杂,但由于我使用Ant进行构建自动化,无论如何我都需要重传器,只有一次性开销来设置集合框架backport.
如上所述,我差不多一年前完成了这项工作,并且主要是从头脑中写出来的,所以我希望它没有错误.如果您对更多细节感兴趣,请给我留言.我有几页关于该过程的德文文档,如果有任何需求我可以提供.
| 归档时间: |
|
| 查看次数: |
4551 次 |
| 最近记录: |