首页  编辑  

无线开发教程第一部分

Tags: /嵌入式开发/   Date Created:

无线开发教程第一部分

从MIDlet开发开始

作者: Jonathan Knudsen ,Dana Nourie

2, 12, 2002

翻译:王锦全

示例代码下载: HelloMIDlet.java

本文包含所有你需要了解的关于如何开始在java2微型版环境下进行开发的知识。你将学到如何安装开发工具,如何编写你的第一个J2ME应用,如何编译它,并且学会在一个模拟器上测试它。你将要创建的是MIDlet,它是一个运行在移动信息设备协议子集(Mobile Information Device Profile)上的应用,而该子集是J2ME规范的一个实现。(要了解无线java技术的背景,参见无线java技术的介绍)

大多数MIDlets都要连结某种类型的网络服务,因此本教程的第二部分描述了如何建立一个servlet的开发环境和如何编写、编译并测试一个servlet。本教程的最后一步是创建一个MIDlet并连接到servlet。

你需要准备的

一个MIDP开发环境的系统要求依赖于一个简单的选择:你是否使用Forte[tm] for Java公众版?这是一个免费的集成开发环境(IDE),它能自动完成许多开发中的任务。Forte for Java对你的处理器、可用内存和磁盘空间都有额外的要求。

你将需要:

166MHz或更快的处理器(如果你用的是Forte for Java,则需要300MHz或者更高)

至少64兆内存(如果是Forte for Java,则需要至少128兆)

至少30兆可用磁盘空间(如果准备安装Forte for Java,则至少需要140兆)

MIDP开发工具有面向Linux、Solarise[tm]和Windows操作系统的不同版本。

开发环境有以下三部分软件组成:

Java[tm] 2 标准版开发包 版本1.3或者更高。

J2ME 无线开发工具包(J2MEWTK)。这是一个包含编译和测试MIDlets的工具包。

一个文本编辑器。可以是一个象记事本(Windows平台)那样极其简单的文本编辑器或者象jEdit一样更复杂的文本编辑工具。

当然,使用什么样的编辑器完全取决于你。在Unix系统上,emacs或者vi都是流行的选择。有些Windows开发人员使用记事本,但如果想做许多开发工作的话,你可能希望采用更复杂一点的开发工具。jEdit是一个运行在Java2环境下并在不同的系统上,比如Windows2000和Mac OS X都工作良好的强大的编辑器。Forte for Java有自己的编辑器。

J2ME无线开发工具包(J2MEWTK) 可以独立使用或者作为Forte for Java的一部分来使用。

安装J2SE开发包

不论你是否使用Forte for Java,你都需要J2SE开发包。(你会听到开发人员称之为JDK,或者Java开发人员工具集,但它现在的名字叫J2SE开发包)你可以从http://java.sun.com/j2se/ 下载当前的版本。当前版本是1.4.0。J2SE开发包有面向Linux、Solaris和Windows等不同平台的版本。

J2SE开发包是如何帮助你来开发无线应用的呢?首先,它提供了J2ME无线开发工具包赖以运行的Java平台。其次,它包含一个Java编译器和其他一些工具供J2MEWTK用来构建你的项目。

一旦你下载了J2SE,你需要安装它。在Windows环境下,运行你刚下载的文件。安装工具会询问你一些问题并安装J2SE。如果你接受缺省值,J2SE会被安装在象c:\jdk1.3.1 或者c:\jdk1.3.1_01这样的目录下。你还要修改autoexec.bat 文件(Windows95/98)或者系统属性(Windows NT/2000)来把bin子目录加到你的路径中。以下autoexec.bat文件片断为你展示了如何将J2SE开发包的bin子目录加到你的Windows98目录中:

path %path%;c:\jdk1.3.1\bin

要测试你的安装是否成功,打开一个命令窗口,(如果你已经修改了autoexec.bat文件,你需要先重新启动计算机)输入命令java -version看看会发生什么。以下是在我的电脑上的输出:

C:\>java -version

java version "1.3.1_01"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.1_01)

Java HotSpot(TM) Client VM (build 1.3.1_01, mixed mode)

C:\>

安装J2ME无线开发工具包

接下来的步骤就是安装J2MEWTK--一个简化开发和测试MIDP应用的工具集。(你可以认为J2MEWTK是一个微型的集成开发环境;它能够自动地完成几个与创建MIDP应用相关的任务。)

我们先从http://java.sun.com/products/j2mewtoolkit/ 下载J2MEWTK。然后执行安装文件。安装工具将试图找到你的J2SE SDK;如果出现问题,请检查并确保你将它指向了你的J2SE SDK的安装目录。你还需要指明J2MEWTK是独立运行还是集成到Forte for Java中去。本文假定你将使用J2MEWTK的独立运行模式。除非你指定其他的目录,否则J2MEWTK的文件会被安装在目录c:\J2MEWTK下,并且安装工具将为工具包的各个不同部分分别创建快捷方式。(Windows环境中字母大小写的怪异行为也许会把目录名显示成J2mewtk;但这一点小异常不会带来问题。)

要单独运行工具包,选择Ktoolbar快捷方式。你将看到如下的界面。

无线开发工具包的打开界面

(点击看大图)

J2MEWTK工作在项目上,每个项目的的最后结果就是一个MIDlet套件。开发工具包一次只能处理一个项目。你可以修改项目的属性、编译项目并且在一个设备模拟器上运行这个项目。有几个示例项目已经随开发工具包安装到你的机器上;我们将在后面看到这些示例。

让我们现在就开始创建一个新项目。单击工具条中的New Project按钮。J2MEWTK会提示你输入项目名称和项目中一个MIDlet类的名称。按下图所示输入HelloSuite和HelloMIDlet。

创建一个新项目

一旦你输入了项目名称和第一个MIDlet的名称,J2MEWTK将给你修改项目属性的机会。我们先接受缺省值好了;单击OK按钮完成创建新项目。在J2MEWTK的文本输出框中,你可以看到几条有用的消息显示你的项目源文件的存储位置。在我的机器上,这些消息如下:

Creating project "HelloSuite"

Place Java source files in

"c:\J2MEWTK\apps\HelloSuite\src"

Place Application resource files in

"c:\J2MEWTK\apps\HelloSuite\res"

Place Application library files in

"c:\J2MEWTK\apps\HelloSuite\lib"

J2MEWTK把每个项目存储在apps目录下的一个子目录中。子目录的名称就是项目的名称。这里,J2MEWTK已经创建了一个新目录,c:\J2MEWTK\apps\HelloSuite。每一个项目目录都有标准的结构:

项目目录结构

Bin目录包含了编译过的MIDlet套件(一个.jar文件)和MIDlet套件描述器(一个.jad文件)。Lib目录是你需要包含在你项目中的其他JAR文件的存放位置。Res是资源文件的位置,比如图像和文本文件,这些都要和你的MIDlet套件一起打包。最后,src目录是你保存源代码的地方。包和目录的标准规则在这里同样适用;比如,类users.Root的源代码将存放在文件src/users/Root.java中。

当你用Ktoolbar来编译项目时,有几个额外的目录会被创建:

编译后的项目目录结构

正如你所看到的,J2MEWTK 创建了classes, tmpclasses, 和 tmplib 几个目录。大多数时候你可以不考虑这些目录;他们是供J2MEWTK内部使用的。

创建一个 MIDlet

为了帮你开始进行MIDlet development开发,让我们来写一个简单的MIDlet。选择好一个文本编辑器后,输入、剪切拷贝、或者下载以下代码。

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

public class HelloMIDlet

   extends MIDlet

   implements CommandListener {

 private Form mMainForm;

 public HelloMIDlet() {

   mMainForm = new Form("HelloMIDlet");

   mMainForm.append(new StringItem(null, "Hello, MIDP!"));

   mMainForm.addCommand(new Command("Exit", Command.EXIT, 0));

   mMainForm.setCommandListener(this);

 }

 public void startApp() {

   Display.getDisplay(this).setCurrent(mMainForm);

 }

 public void pauseApp() {}

 public void destroyApp(boolean unconditional) {}

 public void commandAction(Command c, Displayable s) {

   notifyDestroyed();

 }

}

在你的项目src目录中保存上述代码为HelloMIDlet.java。在我的电脑中,文件被保存在c:\J2mewtk\apps\HelloSuite\src\HelloMIDlet.java中。

接下来,单击工具条中的Build按钮。J2MEWTK将试图编译你的项目。如果出现编译错误,你会在Ktoolbar的文本输出框中看到它们。改正编译错误直到项目编译成功。

现在,你可以准备测试你的MIDlet套件了。单击Run按钮。你会看到有一个手机模拟器弹出:

运行在模拟器上的HelloSuite

模拟器显示了在MIDet套件中包含的MIDLet的列表。本例只显示了一个MIDLet。虽然这里显示的名字是HelloSuite,但实际运行的类是HelloMIDlet。要搞清楚映射是在哪里发生的,可以回到Ktoolbar并单击设置…按钮。然后点击MIDlets页察看本项目包含的MIDLet列表。

回到模拟器,单击Launch下的软按钮来启动MIDlet。模拟器将显示一个如下的简单屏幕。单击Exit按钮关闭MIDlet。关闭模拟器窗口或单击Escape键结束模拟器会话。

运行在模拟器上的HelloMIDlet

你刚才运行的模拟器叫做DefaultGrayPhone。J2MEWTK还有其他的模拟器,包括一个寻呼机,一个彩色电话和其他的基于真实设备如摩托罗拉i85s电话和RIM BlackBerry的模拟器。试试在其他设备上运行一下HelloMIDlet,看看用户界面会变成什么样。(使用PalmOS模拟器的MIDP应用只有在你安装了Palm OS模拟器后才能运行,该模拟器叫做POSE,可以从这里另外下载)只需要从Ktoolbar上的下拉列表框中选择一个你喜欢的模拟器,然后再次单击Run就可以了。

如果玩腻了你的HelloMIDlet,你或许想看看J2MEWTK一起带来的其他几个项目。你可以随意打开demos, games, 和 photoalbum 示例项目。

详情速览

现在,你已经找到了一些乐趣,让我们再回过头看看J2MEWTK到底为我们做了些什么。虽然它作的工作没有什么复杂的,但是它替我们完成了几个有潜在危险的步骤并将它们简化成一个简单的按钮点击动作。

首先,当你单击Build按钮时发生了什么呢?J2MEWTK在项目的src目录下找到所有的.java文件并编译它们。这不是普通的编译过程,因为这些源文件必须在MIDP环境而不是J2EE环境下编译。要理解这个区别,考虑使用java.lang.System 类的MIDlet。这个类在J2SE 和 MIDP中具有不同的API。当J2MEWTK编译你的MIDlet类时,你希望它使用MIDP的java.lang.System,而不是它的J2SE版。

通过使用带-bootclasspath 参数的javac命令你可以自己作出选择,但让J2MEWTK替你考虑这些事情会更简单。

在MIDP设备上运行MIDP类之前,除了需要编译它们,MIDP类还必须经过预验证。你可能会记得J2SE有一个字节码验证器用来在.class 文件被装载之前检查它们。在MIDP环境里,验证被分成两步。工具包会在编译的时候执行一个初始验证,然后,在设备装载这些类的时候,它们的运行环境系统会执行第二次验证。

你可以使用命令行工具preverify来自己执行第一步验证,但把它留给J2MEWTK去做会更简单。

最后,所有的MIDlet会被打包成MIDlet套件以便发布到真实的设备上。这一过程同样包括把MIDlet套件的类文件、资源文件打成jar文件并把额外的信息写入到JAR声明文件中去。同样,这一繁琐的工作最好还是留给J2MEWTK去做。要打包你的MIDlet套件,选择菜单Project | Package。系统会在项目的bin目录下为MIDlet套件生成.jad和.jar文件。

好戏还在后头

你现在已经掌握了初步的MIDP开发知识并拥有了开发你自己的MIDlet套件的软件。虽然这已经很棒,但MIDP客户端编程只是我们美丽图画的一半。除了某些例外,大部分有趣的MIDlet都是那些连接某些网络服务的MIDlet。在本文的第二部分,你将学会如何安装、配置并运行一个服务器环境。你将写一个Java小服务程序(servlet)并修改上述的MIDlet以便它可以连接到这个Java小服务程序,在那时候,整个世界才真正属于你。