Chinaunix首页 | 论坛 | 博客
  • 博客访问: 754093
  • 博文数量: 771
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-11 14:24
文章分类

全部博文(771)

文章存档

2011年(1)

2008年(770)

我的朋友

分类:

2008-09-11 14:26:02

  众所周知,j2me平台受限于各厂商对KVM的实现不同。此外,由于不同终端性能的差别,j2me开发中的 机型适配是相当繁琐的工作。当然,对于该难题,有很多种解决方案。例如,可以使用j2mepolish,请参考本人以前发表的文章《使用J2mePolish的build和preprocess功能》。本文主要讨论如何使用antenna来解决这个问题。

  Antenna介绍

  Antenna是基于ant的j2me开发工具。可以使用antenna对j2me程序进行 编译、校验、打包、混淆等,甚至可以通过antenna所定义的task,运行已经打包完成的jar;还可以将打包完成jad和jar部署到OTA上。

  以上功能,只是对ant的扩展,在我以前的文章《使用Ant对j2me程序打包》也讨论。其实,以上所说的功能,直接使用ant也能实现,只是antenna对这些task进行了扩展,使得对j2me程序的打包过程更加的傻瓜话罢了。貌似,话说到这里有些自相矛盾了,既然这些功能ant都能实现,还介绍antenna干嘛呢?其实,本人最推崇antenna的,不仅是它对j2me打包过程的简化,而且特别赞赏它对预处理的支持。除此之外,antenna的预处理,结合了j2mepolish所提供的device.xml数据库,就是说,我们也可以像在j2mepolish中那样,对源程序进行相关的处理,以达到多机型时配的要求。

  Antenna中的预处理

  中的预处理原来与j2mepolish等支持预处理的软件一致,都是在编译之前,对代码中定义的预处理脚本进行处理,并生成符合脚本定义规则的代码。

  在antenna中,通过“wtkpreprocess”task来进行预处理。关于预处理脚本的定义,请参考antenna自带doc中的wtkpreprocess.html.此外,本文讨论的preprocessor是指新版的preprocessor,即version=2,原来的预处理机制不在本文讨论范围之内。

  下面举例说明,如何通过在代码中定义脚本获取终端相关信息,类似于《使用J2mePolish的build和preprocess功能》一文中的例子,感兴趣的朋友可以结合起来学习。

  Task定义如下:

  xml 代码

  

  device="Nokia/6600" printsymbols="true" />

  其中,device为制定的机型型号,而printsymbols用于标示,是否在处理过程,将所有的标记打印出来。出于学习和调试目的,最好设置为true

  源代码片断:

  java 代码

  public class MyCanvas

  //#if Package">'nokia-ui'@Package

  //# extends com.nokia.mid.ui.FullCanvas

  //#else

  extends Canvas

  //#endif

  {

  //#ifdef key.LeftSoftKey

  //#expand public final static int KEY_SOFT_LEFT = %key.LeftSoftKey%;

  //#else

  public final static int KEY_SOFT_LEFT = 6;

  //#endif

  //#ifdef key.RightSoftKey

  //#expand public final static int KEY_SOFT_RIGHT = %key.RightSoftKey%;

  //#else

  public final static int KEY_SOFT_RIGHT = 7;

  //#endif

  int screenWidth = getWidth();

  int screenHeight = getHeight();

  public MyCanvas()

  {

  //      #if !()

  //# setFullScreenMode(true);

  //#endif

  }

  protected void paint (Graphics g)

  {

  //#ifdef ScreenSize

  //#expand String screensize = "%ScreenSize%";

  //#else

  String screensize = "128x128";

  //#endif

  g.setColor(0);

  g.fillRect(0, 0, screenWidth, screenHeight);

  g.setColor(255,255,255);

  g.drawString(screensize, screenWidth/2, screenHeight/2, 0);

  }

  }

  如此一来,就可以通过antenna中的预处理机制,解决多机型之间,键值不同,屏幕大小不同,扩展API不同等问题。

  注意,device.xml中,有些数据并没有定义。例如,各终端的导航键值就没有定义。可自行添加到device.xml中,然后覆盖原来的antenna包中的device.xml即可。

  目录结构定义

  在打包过程中,对整个工程的目录设置如下,具体体现在build.xml中

  src ——源码目录

  res——资源目录

  build

  —— 编译后的class文件以及从res复制过来的资源文件

  ——jar和jad文件

  dist——预处理后的java文件

  Ant脚本

  按照以上分析,build.xml文件定义如下:

  xml 代码

  

  

  <!—— 相关变量定义 ——>

  

  

  

  

  

  <!—— 目录结构定义 ——>

  

  

  

  

  

  

  

  

  

  

  

  

  <!—— JAD相关属性定义——>

  

  

  

  <!——Midlet相关定义——>

  

  

  <!——发布——>

  

  

  

  <!——target>

  

  

  

  <!——target>

  

  

  

  

  <!——target>

  

  Starting compile<!——echo>

  

  build from all the ${dir.src} to ${dir.classes}<!——echo>

  

  <!——wtkbuild>

  <!——target>

  

  

  

  

  

  

  <!——copy>

  

  

  jarfile="${dir.deployed}/${jar.filename}.jar"

  name="${jad.midlet-name}"

  vendor="${jad.midlet-vender}"

  version="${jad.midlet-version}">

  

  class="${jad.midlet-class}"

  icon="${jad.midlet-icon}"/>

  

  

  

  

  <!——wtkjad>

  

  jadfile="${dir.deployed}/${jad.filename}.jad"

  obfuscate="${wtk.obfuscate}"

  preverify="true" classpath="E:\Develpment\wtk100\lib\nokiaui.zip">

  

  <!——wtkpackage>

  <!——target>

  注意:如果是在Eclipse中使用ant 来运行build.xml,请注意ant_home路径的设置,且确认ant_home\bin目录下存在antenna包。

【责编:John】

--------------------next---------------------

阅读(453) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~