概述
目前,移动开发已经成为开发者社区最为引人注目的新技术。移动互联网蕴藏的巨大商机以及嵌入式开发的神秘色彩使得越来越多的程序员开始学习和研究移动开发技术。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。Ktoolbar的界面如图1-1所示:
图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——存放Java源文件
·tmpclasses——编译后的class文件
·classes——经过预校验的class文件
·bin——存放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。