概述
目前,移动开发已经成为开发者社区最为引人注目的新技术。移动互联网蕴藏的巨大商机以及嵌入式开发的神秘色彩使得越来越多的程序员开始学习和研究移动开发技术。J2ME、Symbian、Windows Mobile、BREW是目前主流的技术平台,其中J2ME凭借其开放的特性占据了绝对的市场,成为了移动开发领域的标准。相比其他平台,J2ME的参考资料也更丰富,更适合初次涉足此领域的开发者入门。
所谓工欲善其事,必先利其器。本文主要讲述目前主流的用于开发J2ME应用程序的开发工具,包括SUN Wireless Toolkit 2.2、Netbeans IDE 4.1、Eclipse 3.1和JBuilder。通常,开发应用程序的时候都会针对具体的目标平台,比如Nokia Series60系列。如果可以把第三方的SDK集成到我们熟悉的开发工具中,必将方便调试和测试,缩短软件开发周期。文章最后讲解如何将第三方SDK集成到开发工具中。本文使用Windows XP操作系统并假设读者已经正确的安装了J2SDK 1.4.2或者更高版本。
SUN Wireless Toolkit 2.2
WTK是一系列工具的集合,包括Ktoolbar、模拟器和辅助工具,使用它们可以为移动电话或者其他嵌入式设备开发MIDP应用程序。从2.3 Beta版本之后,SUN将WTK的名称修改为SUN Java Wireless Toolkit,本文使用WTK 2.2正式版。首先从http://java.sun.com 下载软件,并安装到C:\WTK22目录。Ktoolbar是整个WTK 2.2的核心组件,选择“开始”“所有程序”“J2ME Wireless Toolkit 2.2”Ktoolbar。
图1-1 Ktoolbar运行界面
使用“打开项目”功能可以方便地运行WTK 2.2自带的Demo项目,读者可以访问C:\WTK 22\apps目录研究项目代码,对初学者来说,这是不错的学习途径。Ktoolbar也提供了“新建项目”的功能,可以新建MIDP应用程序。遗憾的是没有提供代码编辑的功能,因此很少开发者会直接使用WTK作为开发工具。本节我们不讲述如何使用WTK 2.2一步步开发MIDlet,而是介绍如何使用命令行方式开发MIDlet。之所以选择这种方式,是为了让读者清楚MIDP应用程序的开发流程,避免在下一节介绍集成开发环境的时候,只能知其然,不知其所以然。
为了能够在命令行下完成编译、预校验和打包工作,首先把J2SDK和WTK安装目录下的bin目录加入到环境变量中。
C:> SET PATH=%PATH%;C:\WTK22\bin
C:> SET PATH=%PATH%;C:\j2sdk1.4.2_03\bin
开发MIDP应用程序与Java应用程序存在一些差异,为了方便。我们首先设置一些环境变量,如下所示:
C:> SET WTK_HOME=C:\WTK22
C:> SET MIDPAPI=%WTK_HOME%\lib\midpapi20.jar
C:> SET MIDPCP=%WTK_HOME%\wtklib\kenv.zip;
%WTK_HOME%\wtklib\kvem.jar;%WTK_HOME%\wtklib\lime.jar;
%WTK_HOME%\lib\cldcapi10.jar
在WTK_HOME\apps目录下面新建一个目录命名为cmdProject。cmdProject将作为我们的项目目录。在cmdProject中新建如下四个子目录:
?src?D?D存放Java源文件
?tmpclasses?D?D编译后的class文件
?classes?D?D经过预校验的class文件
?bin?D?D存放JAD和jar文件
做好所有准备工作后,开始新建MIDlet。首先在src目录下创建HelloWorld.java文件。源文件内容如下所示:
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class HelloWorld extends MIDlet implements CommandListener { private Display display; public static final Command exitCommand = new Command("退出", Command.EXIT, 1); public HelloWorld() {} public void startApp() { if (display == null) { display = Display.getDisplay(this); } TextBox t = new TextBox("Netbeans", "出色的Java开发工具", 256, 0); t.addCommand(exitCommand); t.setCommandListener(this); display.setCurrent(t); } public void pauseApp() {} public void destroyApp(boolean unconditional) {} public void commandAction(Command cmd, Displayable displayable) { if (cmd == exitCommand) { destroyApp(false); notifyDestroyed(); } } }
下面的命令用来编译src目录下的所有源文件并且把他们输出到预先创建好的目录tmpclasses。注意我们已经指定了MIDP API的类路径,确保编译器使用CLDC和MIDP的类库进行编译,否则会使用J2SE SDK的类来编译。
C:\WTK22\apps\cmdProject>javac ?Cd tmpclasses -bootclasspath %MIDPAPI% -classpath %MIDPCP% src/*.java
执行上面的操作后可以在tmpclasses目录下看到HelloWorld.clas文件,现在应该对class文件进行预校验。
C:\WTK22\apps\cmdProject>preverify ?Cclasspath %MIDPAPI%;%MIDPCP%;tmplasses -d classes tmpclasses
经过预校验的class文件已经存放在了classes目录,下面可以使用jar命令把这些文件打包。在此之前使用记事本编写一个 MANIFEST.MF文件存放在cmdProject/classes目录中,MANIFEST.MF是jar包内的描述文件。内容如下:
Manifest-Version: 1.0
MIDlet-1: HelloWorld,,HelloWorld
MIDlet-Jar-URL: HelloWorld.jar
MIDlet-Name: HelloWorld
MIDlet-Vendor: J2MEdev,RT Inc.
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-2.0
使用jar命令进行打包操作:
C:\WTK22\apps\cmdProject\classes>jar cvfm HelloWorld.jar MANIFEST.MF *.class
这样将在classes目录下生成HelloWorld.jar文件,文件大小为1277字节(在不同电脑上可能不同)。使用记事本编写一个 HelloWorld.JAD文件,注意一定要在JAD文件中添加MIDlet-Jar-Size属性,通过察看HelloWorld.jar的文件大小可以得到。HelloWorld.JAD文件内容如下:
MIDlet-1: HelloWorld,,HelloWorld
MIDlet-Jar-URL: HelloWorld.jar
MIDlet-Jar-Size: 1277
MIDlet-Name: HelloWorld
MIDlet-Vendor: J2MEdev,RT Inc.
MIDlet-Version: 1.0
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-2.0
最后使用emulator命令来运行HelloWorld应用程序
C:\WTK22\apps\cmdProject\classes>c:/wtk22/bin/emulator -Xdescriptor HelloWorld.JAD
使用命令行方式让我们更容易理解MIDP应用程序的开发流程。总结如下:
1. 编写Java源文件
2. 编译java源文件为class文件
3. 对class文件进行预校验,这一点与J2SE环境有区别。由于移动设备的内存和处理器能力有限,如果像J2SE那样在虚拟机内进行校验处理那么会给设备带来很大的负担。因此预校验选择在开发平台中完成。目标设备上的虚拟机只进行少量的校验工作。
4. 编写MANIFEST.MF文件,打包项目文件包括class文件和资源文件,例如文本和图片。
5. 编写JAD文件
WTK 2.2还提供了很多有用的辅助工具用于开发J2ME应用程序,例如网络监视器可以方便的监视客户端与服务器端的通信;内存监视器可以监视程序运行过程中内存的消耗情况,可以以此为根据对程序进行适当的优化;短消息控制台和蓝牙控制中心可以在开发基于WMA和蓝牙的应用程序时协助调试。
尽管WTK2.2已经提供了如此多的功能,还是很难掩饰其不能编辑代码,对项目管理不够强大的不足。下面介绍几款非常出色的集成开发环境。
Netbeans IDE和Mobility Pack
Netbeans是一个开源项目,致力于为开发者提供稳定、出色的开发工具。Netbeans IDE和Netbeans平台是netbeans.org的两个著名产品。目前Netbeans IDE的下载次数已经超过了500万次,可见这一集成开发环境受欢迎的程度。现在最为稳定的版本是Netbeans IDE 4.1,虽然官方已经发布了功能更为强大的Netbeans IDE 5.0 beta2版,这里还是推荐开发者使用Netbeans IDE 4.1,同时期待Netbeans IDE 5.0正式版的发布。
Mobility Pack用于开发、测试和调试MIDP应用程序。Mobility Pack 4.1可以和Netbeans IDE 4.1无缝集成,支持CLDC 1.1和MIDP 2.0开发环境。Mobility Pack还可以很容易地与第三方模拟器集成为开发者提供所需的运行环境。
首先从http://www.netbeans.org下载 Netbeans IDE 4.1和Mobility Pack 4.1,可以根据爱好选择英文版或者中文版本。和其他的Windows软件的安装方式一样,依次安装Netbeans IDE 4.1和Mobility Pack 4.1。这样我们就已经搭建好了J2ME的开发环境,比下一节将要介绍的eclipse要容易一些。
Netbeans IDE把项目按照类别分为:常规、Web、企业和移动。开发MIDP应用程序的时候,应该选择移动分类。在此分类中可以新建Mobile Application、Mobile Library,还可以直接导入WTK自带的Demo项目。
Netbeans IDE和Mobility Pack提供的项目管理功能非常出色,将目标平台、应用程序描述符、编译运行、混淆、签名等功能集成在了一起。开发者只需要选中项目,右键选择属性即可配置上述选项。值得注意的一点是,当项目中使用了图片或者媒体文件等资源的时候,应该在“库和资源”选项中讲资源文件所在的文件夹添加到“捆绑的库和资源” 中。避免在java程序中访问资源的时候抛出空指针异常。Mobility Pack 4.1还直接集成了Proguard混淆器,可以设置混淆的级别,混淆的级别越高,混淆的力度就越大。
Mobility Pack 4.1提供了可视化用户界面设计器,开发者可以使用鼠标通过拖拽的方式设计应用程序的用户界面,通过流程控制器实现界面之间的跳转,而不用编写任何代码。无线连接向导是Mobility Pack 4.1另一新特性,可以方便快速的开发出端到端的企业级应用程序,服务器端只提供需要导出的服务类,Netbeans IDE会自动生成服务器端的servlet以及客户端用于连接网络的代码。虽然上述两个功能使用起来非常方便,但是缺乏灵活性,你很难再更改开发工具为你自动生成的代码。开发者使用的时候应该谨慎选择。同时希望Mobility Pack 5.0进一步完善和增强上述两个令开发者心动的特性。
Eclipse和eclipseME
Eclipse是IBM开发的开源工具,恐怕已经成为了Java开发者最为欣赏的开发工具。围绕Eclipse的插件更是层出不穷。eclipseME就是一个非常出色的用于开发MIDP应用程序的第三方插件。上述软件可以分别从http://www.eclipse.org和http://www.eclipseme.org下载,推荐使用Eclipse 3.1和eclipseME 1.2.1版本。直接解压缩eclipse 的压缩文件到D:\eclipse即可完成安装,接下来需要安装eclipseME插件。运行eclipse,选择“help”?D?D “Software Updates”?D?D“Find and Install”?D?D“search for new features to install”,然后选择“new Archived Site”,找到eclipseME1.2.1发布包的目录。按照系统提示最后完成eclipseME插件的安装。
成功安装了 elcipseME插件后,还需要在“Preferences”?D?D“J2ME”?D?D“Platform Components”中添加Wireless Toolkit,按照系统提示将前面安装的WTk 2.2加入,这样就彻底搭建了eclipse开发J2ME程序的环境。可见使用eclipse搭建J2ME的开发环境比Netbeans IDE稍显复杂。事实上,管理eclipse的各种插件已经让很多开发者头疼不已,有些插件的更新还很难保证。这也是为什么笔者放弃了长期使用的 eclipse,选择了Netbeans IDE 4.1。
JBuilder
JBuilder是开发MIDP应用程序的另一选择,与前面介绍的工具不同的是,JBuilder并非免费软件,开发者需要购买才可以使用正式版本。从 JBuilder 9版本开始,Borland将WTK直接集成到了开发工具内。如果使用以前版本的JBuilder,那么需要首先安装MoblieSet插件。其实,各种开发工具只是以自己的方式对MIDP应用程序的开发进行了封装,原理还是前面介绍的MIDP应用程序的开发流程。因此这里不对如何使用JBuilder开发J2ME程序做过多介绍,读者可以参考开发工具的帮助文档。
开发工具集成第三方SDK
设备制造商的SDK各式各样,很难全面讲解如何将它们集成到一种或者多种开发工具中,本节的目标在于介绍一种整合的思路。对于不符合统一模拟器接口(UEI)的SDK,例如Motorola的J2ME SDK,开发者应该参考厂商发布的文档,按照说明将其整合到适当的开发工具中;对于符合UEI接口的第三方SDK,例如Nokia和 SonyEricsson提供的J2ME SDK,我们只需要把第三方SDK的根目录作为目标平台添加到开发工具的SDK(或者称为Java平台)中。这样在新建MIDP项目的时候,就可以方便的选择这些SDK和提供的模拟器了,如果需要它们自带的类库,也可以把相关的jar文件添加到项目中。
以Netbeans IDE 4.1整合Nokia Developer Suite 3.0为例,假设NDS 3.0安装在C:\Nokia目录。运行Netbeans IDE 4.1,选择工具?D?DJava平台管理器?D?D添加平台,选择平台文件夹为C:\Nokia\Devices\ Nokia_Prototype_SDK_2_0。然后按照系统提示进行操作,NDS 3.0就可以正常集成到Netbeans IDE开发环境中了。
总结
开发工具固然重要,它可以提高软件开发效率,缩短周期。甚至可以方便的进行单元测试和团队协作。但是,掌握MIDP应用程序模型,熟悉开发流程比单纯地掌握开发工具更加重要。因此本文的重点放在了介绍如何使用命令行开发MIDP应用程序,为后面介绍开发工具奠定了基础。J2ME技术发展非常迅速,新技术层出不穷。赶快选择一款适合你的开发工具,赶上这趟飞速行进的列车吧。