logo资料库

利用JAVA编写手机应用程序.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
利用 Java 编写手机应用程序 作者:未知 发布时间:2005-03-12 来源:JSP 天空网 Motorola iDEN 篇 王森 台湾交通大学科技管理研究所 moli.mt88g@nctu.edu.tw ?前言 本文内容的所有操作皆在 Windows 200 操作系统上经过测试。如果您在不同的平台上验证本文内容,例 如 Windows 98 或是 Windows Me,则我们无法保证会有相同的结果。 ?简介 不知从什幺时候开始,我们突然感觉到周围的人各各拥有一只手机。利用手机与别人沟通成了我们生活 的一部份。北欧某些先进国家的人民可以利用手机购买自动售货机所出售的商品;他们也可以在从事行动 商务(m-commence) 交易时利用手机做为一种认证工具。在日本,行动电话的许多附加功能更是年轻人文 化的一部分。即将来临的 3G,无线宽频的美梦带给了人们对无线通讯未来的期待。 然后,有些厂商开始行销它们自己生产的 PDA,好象没有一台 PDA 在手,就不像现代人似的。各式各 样的 PDA 充斥市面,畅销的与不畅销的,让人眼花撩乱。这时产生了一个大问题--要我们同时携带手机 和 PDA 是一件很麻烦的事情-就算它们都还算轻薄短小。如果可以把手机和 PDA 合而为一岂不是更方便 吗? 于是听到消费者心声的厂商,开始有推出手机和 PDA 合而为一的产品,从 NOKIA 9000、Motorola A6188(太极),到最近要推出的 Ericsson R380、NOKIA 9210,都是手机与 PDA 结合的例子,虽然因为售 价的关系,但是这些产品仍然是许多人梦寐以求的高阶产品。 尽管有了 PDA 与手机结合的产品出现,我们仍然觉得有所不足,我想大家一定发现了,就是应用程序的 不足,虽然手机和 PDA 结合了,可是这些产品上的 PDA 功能看起来似乎是死的。我们可以任意在 PalmOS、Windows CE、EPOC 等 PDA 上使用 C/C++或是 Java 编写这些平台上的应用程序,但是却从未 有过机会将我们写好的程序下载到这些手机上执行(即使有些手机的 PDA 也是使用 EPOC,如 Ericsson R380)。 相信厂商也听到我们这些喜欢到处写程序的工程师的心声了,所以从 2000 年年底开始,即将陆陆续续有 许多支持 Java 的手机即将推出,当然,这些厂商也提供了在手机上开发程序的 SDK,我们终于可以在手 机上面写些小程序自娱了!这是以前等了很久的美梦。 手机平台的多样性与复杂性,和 PDA 比较起来可以说是有过之而无不及,于是大家就可以知道 - 哈!又 是 Java 派上用场的时候了。我们都知道在浏览器上执行的 Java 程序叫做 Applet,在 PalmOS 上执行的 Java 程序叫做 Spotlet,然而在手机上执行的应用程序我们称做 MIDlet,相信对大家来说都是一个陌生的名词, 这也就是本篇文章所要介绍的主角。
支持 Java 的手机大厂目前已知有 NOKIA (预计在 2001 年年初推出一款支持 Java 的手机 NOKIA 9210)、 Motorola(会先在支持 integrated Digital enhanced network(iDen)网络的手机上支持 Java,然后再推出支持 Java 的 GSM 手机,该公司的手机大致会在 2002 年前全部支持 Java)以及 NTT DoCoMo(将在明年第二季 度左右推出支持 Java 的手机)。 虽然这些大公司都准备支持 Java,不过在决定编写本文时,只有 Motorola 将其 SDK 开放于网站上供程 序开发者下载测试,所以本文内容都是根据 Motorola J2ME SDK 所编写。又由于这些手机市面上无法取 得,所以我们的程序都是在 SDK 内附的模拟器中执行,相信最后这些手机上市时,我们所编写的 MIDlet 应该会很容易并成功地在 Motorola 的手机上执行才对。 ?如何取得 Motorola J2ME SDK 我们要做的第一件事情当然还是要先取得 SDK 罗! 请直接到 https://commerce.motorola.com/idenonline/ideveloper/下载 Motorola J2ME SDK Drop 7。如果您不 是 iDEN® Developer 的会员,请先在网络上注册(免费)。注册成功之后,Motorola 会将密码寄到您的 email 信箱之中,然后使用该密码登入网页上的 My Development Center。进入之后选择网页上头的 TOOLS & RESOURCES 以进入可下载的开发工具的网页,请选择 Motorola J2ME SDK Components Developer Edition, Drop 7.0 下方的下载超连结以下载 SDK,整个 SDK 的大小约为 3 MB 左右。 请注意下载前的 Download Page for Motorola J2ME™ SDK 安装说明,里头会告诉你安装密码,请先 行记下。稍后当您在您的电脑上安装 Motorola J2ME SDK 的时候,会询问您安装密码,所以请务必记下 该密码。 ?Motorola J2ME SDK 的安装 安装需求 根据官方需求,安装 Motorola J2ME SDK 的基本配备为: Pentium 100 MHz 微处理器 64 MB RAM Windows NT WorkStation 4.0 配合 Service Pack 3 / Win98 (本文是在 Windows 2000 Professional 中文版上测试) 约 6 MB 的硬盘空间 Java 2 SDK 1.2.2 (本文使用 Java 2 SDK 1.3.0_01 作测试) 安装 Motorola J2ME SDK 要安装新版 Motorola J2ME SDK 之前,请先确认您已经将旧版的 Motorola J2ME SDK 完全删除。您可以 由控制台里头的 「新增/删除程序」的功能删除旧版 Motorola J2ME SDK。之后再将旧版 Motorola J2ME SDK 安装所在路径清除即可。 解开您从 Motorola 网站上下载的 ZIP 文件,您会看到一个名为 Motorola_SDK.exe 的文件,双击此文件即 可开始安装动作。请注意,在安装时系统会要求您输入密码,请输入之前所纪录的安装密码即可。 ?Motorola J2ME SDK 目录结构
当您成功地安装 Motorola J2ME SDK 之后,其目录结构如下图: ?MIDlet 程序结构 在手机上执行的程序我们统称 MIDlet,其程序结构很简单,与大家熟悉的 Applet 结构有异曲同工之妙。 每一个 MIDlet 程序都必须继承自 javax.microedition.midlet.MIDlet 类别,并实做三个函式,它们分别是: protected void startApp() protected void pauseApp() protected void destroyApp(Boolean unconditional) 而一个 MIDlet 程序的起始与结束之流程我们以下图来表示: ?编写并编译 MIDlet 请先到您的 Motorola J2ME SDK 安装目录下的 demomidlets 目录底下新建一个名为 HelloMIDlet.java 的文 件,其内容为: HelloMIDlet.java import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class HelloMIDlet extends MIDlet { HelloMIDlet() { } protected void startApp() throws MIDletStateChangeException { } protected void pauseApp() { } protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException { } } 在 demomidlets 目录之中您会看到一个名为 compileAll.bat 的批处理文件,前面有提到,这个批处理文件 除了可以帮助您编译所有内附范例程序之外,还可以简化您自己所编写的 MIDlet 之编译流程。 请在命令列视窗输入: compileAll HelloMIDlet.java 如果成功编译,屏幕上输出的结果如下图所示: 从屏幕上的输出,您可以发现,要让 MIDlet 可以在手机上执行,大体上还是要经过两个动作(与 Spotlet 相似),分别是编译(compiling)以及预先审核(Preverifying)。 有关预先审核这个动作,笔者已经在 RUN!PC 11 月号的文章「利用 Java 编写 PalmOS 应用程序基础篇」 之中有向读者们提过,如果对这个方面有所疑问的朋友,请再将您的 RUN!PC 11 月号翻出来复习一下吧! 从这个简短的 MIDlet 制作流程里头,相信大家可以发现,比起纯粹用 Sun 的 CLDC 编写能在 KVM 上执 行的 Spotlet 要简单上许多。原因是 compileAll.bat 这个批处理文件帮我们做掉大部分 dirty work。 那幺,如果您写好的程序并非放在 demomidlets 目录之中,是否就无法编译了? 从 compileAll.bat 里头, 我们可以发现它帮我们完成上述两项工作的指令。如果我们写好的程序放在 demomidlets 目录以外的地 方,您可以执行下面的指令,您仍然可以成功地制作 MIDlet: (我们假设您的 Motorola J2ME SDK 安装在 D:MotoSDK 目录之中,并将您自行编写的 HelloMIDlet.java 置于 d:jdk1.3.0_01my 目录之中。同时我们假设您在 d:jdk1.3.0_01my 目录底下执行下面指令。) 编译: javac -O -bootclasspath d:MotoSDKlib HelloMIDlet.java 注意: -bootclasspath 指向类函数库的所在位置。 预先审核: d:MotoSDK inpreverifier -classpath d:MotoSDKlib;. -d . HelloMIDlet 注意: 1 . -classpath 指向类函数库的所在位置,也要指向我们所编写的 MIDlet 所在的位置。 2 .?d 指向您希望预先编译类文件产生之后所放置的路径,如果写"."表示本目录,会覆盖掉原先未经过预先 编译的类文件。如果您没有指定,则预设值为".output"目录。 当然,如果您嫌自己手动操作很麻烦,您可以将 compileAll.bat 复制到其它目录之中,并更改其编译指令 与预先审核指令之中和类函数库有关的相关设定即可。 提到 compileAll.bat,顺便向各位读者说明一下,在前面有提到,compileAll.bat 可以帮助您编译所有位于 demomidlets 目录下的范例程序,您只要在命列列下直接输入: compileAll 即可。compileAll.bat 会自动当 您编译的 package 有以下几项: com.mot.j2me.midlets.bounce com.mot.j2me.midlets.imagetests com.mot.j2me.midlets.paddleball
com.mot.j2me.midlets.scribble com.mot.j2me.midlets.tests com.mot.j2me.midlets.tutorials 如果您希望 compileAll.bat 自动帮您编译其它 package 底下的程序,请您开启 compileAll.bat,修改其 COMPILECLASS 环境变数的设定即可。 ?修改并执行 MIDlet 写好程序之后,大家最希望的事情当然就是让它在手机上执行,不过由于目前大家无法取得 Motorola 这 些支持 Java 的手机,所以我们只能在 Motorola J2ME SDK 内附的模拟器上执行我们写好的 MIDlet。相信 手机正式推出时,应该可以顺利地在手机上执行。底下笔者将告诉您如何使用 Motorola J2ME SDK 内附 的模拟器来测试您所编写的 MIDlet。 在这之前,由于之前我们所编写的范例程序只是简单的 MIDlet 空壳,我们必须让它能够在模拟器上显示 出一些信息才可以,因此请修改上一个程序范例,使它的内容如下: HelloMIDlet.java import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class HelloMIDlet extends MIDlet { private Display firstDisplay ; private Form firstForm ; HelloMIDlet() { firstDisplay = Display.getDisplay(this) ; firstForm = new Form("Hello MIDlet") ; StringItem firstStrItem = new StringItem("Hello","MIDlet") ; firstForm.append(firstStrItem) ; } protected void startApp() throws MIDletStateChangeException { firstDisplay.setCurrent(firstForm) ; } protected void pauseApp() { } protected void destroyApp(boolean unconditional) throws MIDletStateChangeException { } }
请将此文件放置在 demomidlets 目录下。编译完成之后,请将目录切换到 scripts 子目录之中,您会在此 目录里发现一些写好的批处理文件。请在该目录下执行这些批处理文件指令以启动模拟器。执行的指令 与执行结果如下所示: 指令: runEmul HelloMIDlet 输出结果 指令: runMotoi1000 HelloMIDlet 输出结果 指令: runMotoiDEN HelloMIDlet 输出结果 指令: runStarTac HelloMIDlet 输出结果 指令: runMyDevice HelloMIDlet 输出结果 Error loading property file: C:/properties/mydevice.props (系统找不到指定的路径。)会出现错误信息是因为 您没有指定属于是用者自订的手机外观的缘故,后面将会教您如何设定用户自订的手机外观。 如果我们将写好的程序放在 demomidlets 目录以外的地方,您可以执行下面的指令,仍然可以成功地启动 模拟器并执行 MIDlet: (我们假设您的 Motorola J2ME SDK 安装在 D:MotoSDK 目录之中,并将您自行编写的 HelloMIDlet.java 置于 d:jdk1.3.0_01my 目录之中。同时我们假设您在 d:jdk1.3.0_01my 目录底下执行下面指令。) 执行一般模拟器 java -Djava.library.path=d:MotoSDKlib -classpath d:MotoSDK inEmulator.jar;d:MotoSDK inConfigTool.jar com.mot.tools.j2me.emulator.Emulator -classpath.;d:MotoSDKlib javax.microedition.midlet.AppManager HelloMIDlet -JSA 1 1 请注意: 第一个-classpath 设定,-classpath 与路径名称之间有空格。 第二个-classpath 设定,-classpath 与路径名称之间没有空格。
执行模拟器并套用 i1000 手机外观 java -Djava.library.path=d:MotoSDKlib -classpath d:MotoSDK inEmulator.jar;d:MotoSDK inConfigTool.jar com.mot.tools.j2me.emulator.Emulator -classpath.;d:MotoSDKlib -deviceFile resourcesMotorolai1000.props javax.microedition.midlet.AppManager HelloMIDlet -JSA 1 1 请注意: 第一个-classpath 设定,-classpath 与路径名称之间有空格。 第二个-classpath 设定,-classpath 与路径名称之间没有空格。 执行模拟器并套用 iDEN 手机外观 java -Djava.library.path=d:MotoSDKlib -classpath d:MotoSDK inEmulator.jar;d:MotoSDK inConfigTool.jar com.mot.tools.j2me.emulator.Emulator -classpath.;d:MotoSDKlib -deviceFile resourcesMotorolaiDENPlatform.props javax.microedition.midlet.AppManager HelloMIDlet -JSA 1 1 请注意: 第一个-classpath 设定,-classpath 与路径名称之间有空格。 第二个-classpath 设定,-classpath 与路径名称之间没有空格。 执行模拟器并套用 StarTac 手机外观 java -Djava.library.path=d:MotoSDKlib -classpath d:MotoSDK inEmulator.jar;d:MotoSDK inConfigTool.jar com.mot.tools.j2me.emulator.Emulator -classpath.;d:MotoSDKlib -deviceFile resourcesStarTac.props javax.microedition.midlet.AppManager HelloMIDlet -JSA 1 1
请注意: 第一个-classpath 设定,-classpath 与路径名称之间有空格。 第二个-classpath 设定,-classpath 与路径名称之间没有空格。 执行模拟器并套用用户自订手机外观 java -Djava.library.path=d:MotoSDKlib -classpath d:MotoSDK inEmulator.jar;d:MotoSDK inConfigTool.jar com.mot.tools.j2me.emulator.Emulator -classpath.;d:MotoSDKlib -deviceFile <您的 props 文件所在的绝对路径>javax.microedition.midlet.AppManager HelloMIDlet -JSA 1 1 请注意: 第一个-classpath 设定,-classpath 与路径名称之间有空格。 第二个-classpath 设定,-classpath 与路径名称之间没有空格。 如果您将您的 props 文件放在 d:MotoSDK in 的 resources 目录之下,则上述指令只要改成:-deviceFile resources<您的 props 文件名> 注意,当您您直接使用上述指令启动模拟器,如果出现底下错误信息: Error loading property file: resources/defaultdevice.props (系统找不到指定的路径。) 这是因为您没有将 d:MotoSDK in 目录下的 resources 子目录复制到 d:JDK1.3.0_01my 目录之下的缘故。 ?对 MIDlet 进行调试 编写 PalmOS 上的 Spotlet 时,我们可以利用 System.out.println()函式帮我们印出一些讯息以帮助调试,那 幺在手机上的 MIDlet 呢? 原则上,我们还是可以利用 System.out.println()函式做一些输出。当模拟器执行 时,就会在命令列上输出一些讯息。 另外,在 PalmOS 上,有 KVMutil.prc 可以帮助我们纪录程序所输出的讯息。那手机上呢? 因为没有实际 的机器可以测试,因此这个问题到现在还不得而知,相信 Motorola 到时候会有完善的解决方案吧! 在 Motorola J2ME SDK 内附的说明文件之中,概略地提到了调试的问题,里头提到,往后如果我们要进 行机上调试(on-device debugging)的话,必须要满足几个条件: 机器本身要具备调试相关功能,并与 KDWP(Kvm Debug Wire Protocol)兼容。因为调试时,调试工具需要 利用 KDWP 和机器上交谈以取得调试信息。 制造厂商本身要提供下载 MIDlet 到手机上以进行调试的方法。 提供对 MIDlet 调试的工具,必须支持手机在利用 KDWP 调试时所使用的传输接口(例如串行口或 UDP)。 嗯,看起来能够进行调试,MIDlet 程序的编写应该是很方便的事情了。 ?Motorola J2ME SDK 对中文的支持
分享到:
收藏