日期:2014-05-20  浏览次数:20616 次

Antenna与j2me打包

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

?

Antenna介绍

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

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

?

Antenna中的预处理

中的预处理原来与j2mepolish等支持预处理的软件一致,都是在编译之前,对代码中定义的预处理脚本进行处理,并生成符合脚本定义规则的代码。antenna中,通过“wtkpreprocesstask来进行预处理。关于预处理脚本的定义,请参考antenna自带doc中的wtkpreprocess.html。此外,本文讨论的preprocessor是指新版的preprocessor,即version=2,原来的预处理机制不在本文讨论范围之内。下面举例说明,如何通过在代码中定义脚本获取终端相关信息,类似于《使用J2mePolishbuildpreprocess功能》一文中的例子,感兴趣的朋友可以结合起来学习。

Task定义如下:

?

xml 代码
  1. <wtkpreprocess?verbose="true"?version="2"?srcdir="${dir.src}"?destdir="${dir.dist}"?
  2. device="Nokia/6600"?printsymbols="true"?/>??

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

?

源代码片断:

java 代码
  1. public?class?MyCanvas??
  2. //#if?'nokia-ui'@JavaPackage??
  3. //#?extends?com.nokia.mid.ui.FullCanvas??
  4. //#else??
  5. extends?Canvas??
  6. //#endif??
  7. {??
  8. ????//#ifdef?key.LeftSoftKey??
  9. ????//#expand?public?final?static?int?KEY_SOFT_LEFT?=?%key.LeftSoftKey%;??
  10. ????//#else??
  11. ????public?final?static?int?KEY_SOFT_LEFT?=?6;??
  12. ????//#endif??
  13. ??????
  14. ????//#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?!('nokia-ui'@JavaPackage)??
  • ????????//#?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复制过来的资源文件——jarjad文件

    dist——预处理后的java文件

    Ant脚本

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

    xml 代码
    1. <target?name="init"?description="变量定义">??
    2. ????<echo?message="Define?variable"?/>??
    3. ????<!--?相关变量定义?-->??
    4. ????<property?name="basedir"?value="."?/>??
    5. ????<property?name="midlet.version"?value="1.0"?/>??
    6. ????<property?name="jad.filename"?value="AntennaApp"?/>??
    7. ????<property?name="jar.filename"?value="${jad.filename}"?/>??
    8. ????<property?name="wtk.proguard.home"?value="E:\Develpment\proguard3.9"/>??
    9. ??
    10. ????<!--?目录结构定义?-->??
    11. ????<property?name="dir.src"?value="src"?/>??
    12. ????<property?name="dir.res"?value="res"?/>??
    13. ????<property?name="dir.output"?value="${basedir}/build"?/>??
    14. ????<property?name="dir.dist"?value="${basedir}/dist"?/>??
    15. ????<property?name="dir.classes"?value="${dir.output}/classes"?/>??
    16. ????<property?name="dir.deployed"?value="${dir.output}/deployed"?/>??
    17. ??
    18. ????<property?name="wtk.home"?value="E:\Develpment\SDK\WTK25"?/>??
    19. ????<property?name="wtk.cldc.version"?value="1.0"?/>??
    20. ????<property?name="wtk.midp.version"?value="2.0"?/>??
    21. ????<property?name="wtk.wma.enabled"?value="false"?/>??
    22. ????<property?name="wtk.debug"?value="false"?/>??
    23. ??
    24. ????<property?name="wtk.obfuscate"?value="true"?/>??
    25. ??
    26. ????<!--?JAD相关属性定义-->??
    27. ????<property?name="jad.midlet-name"?value="AntennaApp"?/>??
    28. ????<property?name="jad.midlet-vender"?value="org"?/>??
    29. ????<property?name="jad.midlet-version"?value="1.0.0"?/>??
    30. ??
    31. ????<!--Midlet相关定义-->??
    32. ????<property?name="jad.midlet-class"?value="MyMIDlet"?/>??
    33. ????<property?name="jad.midlet-icon"?value=""?/>??
    34. ??
    35. ????<!--发布-->??
    36. ????<property?name="deploy.target"?value="http://localhost:8080/deployer"?/>??
    37. ????<property?name="deploy.login"?value="admin"?/>??
    38. ????<property?name="deploy.password"?value="admin"?/>??
    39. ??
    40. <!--</span-->target>??
    41. ??
    42. <target?name="clean"?depends="init"?description="初始化环境">??
    43. ????<echo?message="Clean?dir"?/>??
    44. ????<delete?dir="${dir.output}"?/>??
    45. <!--</span-->target>??
    46. ??
    47. ??
    48. <target?name="preprocess"?depends="init,clean"?description="预处理">??
    49. ????<echo?message="preprocess"?/>??
    50. ????<mkdir?dir="${dir.dist}"?/>??
    51. ??????
    52. ????<wtkpreprocess?verbose="true"?version="2"?srcdir="${dir.src}"?destdir="${dir.dist}"?device="Nokia/6600"?printsymbols="true"?/>??
    53. <!--</span-->target>??
    54. ??
    55. <target?name="compile"?depends="preprocess"?description="编译">??
    56. ????<echo>Starting?compile<!--</span-->echo>??
    57. ????<mkdir?dir="${dir.classes}"?/>??
    58. ??
    59. ????<echo>build?from?all?the?${dir.src}?to?${dir.classes}<!--</span-->echo>??
    60. ??
    61. ????<wtkbuild?srcdir="${dir.dist}"?destdir="${dir.classes}"?target="1.1"?source="1.2"?preverify="false"?debug="${wtk.debug}"?listfiles="no"?classpath="E:\Develpment\wtk100\lib\nokiaui.zip">??
    62. ????<!--</span-->wtkbuild>??
    63. ??
    64. <!--</span-->target>??
    65. ??
    66. <target?name="build"?depends="compile"?description="生成">??
    67. ???????<echo?message="Packaging?library"/>?????????????
    68. ???????<copy?todir="${dir.classes}/res">??
    69. ???????????<fileset?dir="${dir.res}"?includes="*.png"?/>??
    70. ???????????<fileset?dir="${dir.res}"?includes="*.properties"?/>??
    71. ???????????<fileset?dir="${dir.res}"?includes="*.midi"?/>??
    72. ???????<!--</span-->copy>??
    73. ????<mkdir?dir="${dir.deployed}"?/>??
    74. ??????
    75. ???????<wtkjad?jadfile="${dir.deployed}/${jad.filename}.jad"??
    76. ???????????????jarfile="${dir.deployed}/${jar.filename}.jar"??
    77. ???????????????name="${jad.midlet-name}"??
    78. ???????????????vendor="${jad.midlet-vender}"??
    79. ???????????????version="${jad.midlet-version}">??
    80. ????????????
    81. ???????????????<midlet?name="${jad.midlet-name}"??
    82. ???????????????????class="${jad.midlet-class}"??
    83. ???????????????????icon="${jad.midlet-icon}"/>??
    84. ????????????
    85. ???????????<attribute?name="MIDlet-Icon"????????????value="${jad.midlet-icon}"?/>??
    86. ???????????<attribute?name="MIDlet-Permissions"?????value="${jad.midlet-permissions}"/>??
    87. ????????<attribute?name="MicroEdition-Configuration"?????value="CLDC-1.0"/>??
    88. ????????<attribute?name="MicroEdition-Profile"?????value="MIDP-2.0"/>??
    89. ???????<!--</span-->wtkjad>??
    90. ????????
    91. ???????<wtkpackage?jarfile="${dir.deployed}/${jar.filename}.jar"??
    92. ???????????????????jadfile="${dir.deployed}/${jad.filename}.jad"??
    93. ???????????????????obfuscate="${wtk.obfuscate}"???
    94. ???????????????????preverify="true"?classpath="E:\Develpment\wtk100\lib\nokiaui.zip">??
    95. ????????????
    96. ???????????<fileset?dir="${dir.classes}"/>??
    97. ????????????
    98. ???????<!--</span-->wtkpackage>??
    99. <!--</span-->target>??

    ?

    1. 注意:如果是在Eclipse中使用ant 来运行build.xml,请注意ant_home路径的设置,且确认ant_home\bin目录下存在antenna包。
    2. ?
    3. 软件版本
    4. apache-ant-1.7.0
    5. antenna-bin-0.9.15-beta.jar
    6. jdk1.5
    7. eclipse3.2
    8. ?
    9. 参考文章
    10. J2ME Antenna 入门 作者:redduke1202
    11. 地址:http://community.csdn.net/Expert/TopicView3.asp?id=5298691 ?
    12. ?
    13. Using_Ant_and_Antenna_MIDP Nokia文档
    14. ?
    15. j2me build.xml例子》 作者:Peter
    16. 地址:http://hi.baidu.com/wapeter/blog/item/3beb9f2268f571f2d6cae2d2.html
    <!---->