| |
j2me与midp开发
在我前面的三篇文章中,我介绍了一些关于j2me的基本的知识,在这篇文章中我想谈谈j2me与midp开发的一些知识,其实在本系列的第二部分我门就已经接触到midp了,现在只是想深入探讨一下。midp是mobile information devices profile(移动信息设备简表)的简称,而遵照 midp和cldc规范编写的 java应用程序我们就称其为 midlet。
你可以从midp这个规范的英文名称的含义推测, midlet是定位于提供某种水平的网络连接性的移动设备。运行 midlet的设备也有好几个共同的属性:有限的屏幕大小,内存和处理能力,这个规范是设计来满足这些需求,典型的设备包含行动电话和呼叫器。
这篇文章将重点介绍安装和配置 cldc和 midp软件,我们也将写一个简单的 midlet并学习在一个移动设备预览这个midlet的必需的步骤,最后再谈一谈如何给midlet打包。
cldc定义了一个用于 java虚拟机的规范和一组核心类库,cldc本质上是一个 java 2标准版 ( j2se )的简化版本,是为了使用有限内存和资源的设备设计的。配置 (比如 cldc )是设计来运行简表的,而mid简表是一个规范,它提供一套核心类库来编写那些用于移动设备的java应用程序。一个简表定义类库,开发者们使用这些类库来为某一特定的设备或用于某一范围的设备编写应用程序。例如, midp定义的类是用于创建用户界面(文本框、表单等),处理用户输入以及使用 http在一个网络上通讯。
第一节 开发midlet
下载软件
在你能写一个 midlet之前,你需要下载必需的软件: jdk,cldc以及 midp。
? java development kit ( jdk )-- 1.2版本以上
? connected, limited device configuration (cldc)
? mobile information device profile (midp)
你也可能选择下载 j2me规范,下载到的这个规范包括 midp应用程序接口,当你是初次开发 midlet时,它是一个非常好的参考。
安装软件
一、jdk
jdk已经默认了用于安装文件的目录,当然了,你也可以选择安装在一个你自己选定的路径。如果安装的 jdk版本是 1.3并且选择默认路径,那么 jdk将被安装到这个目录:c:/jdk1.3
你一定很好奇,为什么需要 jdk?因为 cldc和 midp安装好后都不包括java编译程序 javac.exe,很明显,没有编译程序就没有能力编译你的 java代码,你也不可能有进步。
二、有限连接设备配置 ( cldc )
解压你下载到硬盘上的.zip文件,我推荐路径为 c:/j2me。解压以后,c:/j2me路径的结构如下所示:解压以后,c:/j2me路径的结构如下所示:
c:/j2me | j2me_cldc
三、移动信息设备简表 ( midp )
同上,解压你下载到硬盘上的.zip文件,使用上面相同的目录c:/j2me,现在那个目录结构应该像:
c:/j2me | j2me_cldc midp-fcs
配置软件
一、更新 path
path环境变量是 windows操作系统使用来定位可执行程序的,我们需要更新 path来指向 java编译程序和 cldc、 midp程序的路径。
(1)更新 jdk的path
a、windows 2000或 windows nt系统
? 从控制面板中选择系统
? 点击"高级",再点击"环境变量"
? 找到 path,点入,在最后添加jdk安装路径的/bin目录,假设你安装 jdk是 1.3版本并选择默认安装路径,你将添加:c:/jdk1.3
b、windows 98或 windows 95
如果使用的是windows 98或 windows 95系统,请在c盘跟目录下的autoexec.bat文件的最后面加上以下两行:
set path=c:/jdk1.3/bin;%path% set classpath=.; |
(2)更新 cldc路径
你还需要更新你的path环境变量来指向存放 cldc可执行文件的目录。按照上面概述的相同的步骤来添加到path中:
c:/j2me/j2me_cldc/bin
(3)更新 midp路径
同上面那样,更新 path环境来指出存放 midp可执行文件的目录;这个文件是用于测试你的 midlet的移动电话模拟器。
按照上面概述的相同的步骤来添加到path中c:/j2me/midp-fcs/bin
二、更新 classpath环境变量
classpath告诉 java编译程序到什么地方搜索那些不是 jdk平台本身附带的类库,在本例中,我们需要更新 classpath来指向midp类。你还需要有当前目录的引用("."),作为classpath的一部分,按照上面概述的相同的步骤,更新classpath: classpath=c:/j2me/midp-fcs/classes;. - 注意最后的点"."表示当前的工作目录。
三、添加screen_depth环境变量
midp含有一个测试 midlet用的移动设备模拟器,这个模拟器可以以有色模式运行,也可以运行于黑白两色构成的灰度梯度模式。为了指定颜色数,你可以添加环境变量 screen_depth。例如:
screen_depth=8
添加这个环境变量的方法与处理 path和 classpath变量的方法类似。
screen_depth值和颜色对应表
测试安装
在编写一个 midlet之前,让我们检查一下是否所有的软件都已正确地安装。
1. 进入命令行
2. 测试cldc安装,键入preverify并按回车键。
3. 测试 midp安装,键入 midp并按回车键。应该弹出一个窗口,如下图所示:
4. 测试 jdk安装,键入 java -version并按回车键,屏幕将出现下面的样子。
开发一个midlet程序
在编写midlet程序之前我还要再说两句,前面我也说过了midp程序称为midlet,这可能因为所有的 midlet都是扩展 javax.microedition.midlet.midlet类 (正象 java applet扩展 applet类一样) 除了从键盘或点击设备上接受输入的信息以外, midlet类还提供用于激活、暂停和终结 midlet的接口,即分别是startapp()、pauseapp()和destroyapp() 方法。startapp()方法在概念上与 java applet的 start()方法类似,当midlet启动时它被调用,而且在一个midlet暂停之后恢复时也被调用。
另外一个值得注意的类是javax.microedition.lcdui.command类。这个类定义了好几个移动设备通常使用的语义类型: back、cancel、exit、help、item、menu、ok、screen和stop。通过 javax.microedition.lcdui.displayable类(所有的 j2me ui组件的父类)中的addcommand()方法把这些命令添加到用户界面上。addcommand()方法包括一个优先级参数,允许应用程序提示运行时刻环境应当按照什么顺序显示什么内容。在大多数环境中,如果两个相同类型的命令被使用相同的优先级水平添加的话,环境将显示一个菜单 " menu "选项并允许用户从多个命令选项中选择。
大家是不是心里都痒痒的了,好,让我们开始编写一个非常简单的 midlet吧,这个 midlet将创建一个带有一则消息的文本框。我们还要添加一个命令按钮用于退出这个 midlet。
一、编写 java源代码
创建一个新目录来保存你以后编写的midlet,例如 c:/midlets,在这个目录里再创建一个叫mymidlet的目录,使用任何文本编辑器创建一个名为 simplemidlet.java的文件并输入下面这一段 java源代码。把这个文件保存在c:/midlets/mymidlet目录 (或者任何你选择的目录)。 代码段1
simplemidlet.java
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class simplemidlet extends midlet implements commandlistener { private display display; // 引用midlet的display 对象 private textbox tbxmain; // textbox 显示一条消息 private command cmdexit; // 设定按钮用于退出midlet
// midlet构造程序 public simplemidlet() { display = display.getdisplay(this);
cmdexit = new command("exit", command.screen, 1);
tbxmain = new textbox("simple midlet", "welcome ", 50, 0); tbxmain.addcommand(cmdexit); tbxmain.setcommandlistener(this); }
// 被应用程序管理器调用来启动midlet。 public void startapp() { display.setcurrent(tbxmain); }
// 一个必要的方法 public void pauseapp() { }
file://一个必要的方法 public void destroyapp(boolean unconditional) { }
file://检查一下是否选择了退出命令 public void commandaction(command c, displayable s) { if (c == cmdexit) { destroyapp(false); notifydestroyed(); } } } |
此时,先不必担心每行代码是做什么用的,把注意力放在开发这一整个环节中。
二、编译并预验证(preverify)
现在你必须编译这个 java源文件并且 preverify生成的.class文件。
1.编译源代码
进入命令行形式,进入你保存文件的项目目录,使用下面的命令编译程序。使用下面的命令编译程序。
| avac -bootclasspath c:/j2me/midp-fcs/classes simplemidlet.java |
选项 - bootclasspath c: /j2me/midp - fcs/classes指定了 java自举(启动)类文件目录。我们必须自己指向midp类,否则javac会使用默认的jdk类库去编译midlet程序。不出问题的话,就能顺利地编译simplemidlet.java生成simplemidlet.class文件 (默认情况下,生成的.class位于 java源文件所在的目录)。
2.预验证类文件。
| preverify -classpath c:/j2me/midp-fcs/classes;. -d . simplemidlet |
选项" -classpath c:/j2me/midp-fcs/classes;." 指定了到哪里去寻找用于预验证的.class文件。这包括需要用来做验证处理的 midp类 (通过 c:/j2me/midp-fcs/classes指定 )和你的类文件,它位于当前目录 (就是"."指定的)。
选项"-d." 告诉预验证器把验证过的类文件放在什么地方。这一点"." 指当前目录,即原始的类文件相同的位置。
注意:前面的 preverify命令行选项将用一个新的、预验证过的类文件覆盖原先的类文件。你可以分两个目录,一个用来保存通过编译的类文件,另一个用来保存通过预验证创建的类文件。但是没有经过预验证的类文件是不能被应用程序管理器载入的。
3、运行 midlet
我们现在准备在移动设备模拟器中运行 midlet,如果你现在还处在命令行方式,请输入
应该可以看到下面的输出结果:
第二节 封装midlet
下面我想谈谈封装midlet的相关知识,即介绍一下 midlet套件以及java档案和应用程序描述器文件,为了说明方便,我们还将写一个midlet程序并利用上面介绍的那个midlet程序,并创建jar文件和jad文件来封装这些程序。我们还要看着如何使用 java程序包改变我们的开发过程。最后你将学习如何从一个web服务器上访问 midlet。
midlet套件
虽然把midlet封装进 java档案文件(jar)并不一定必要,但这是发布 j2me/midp应用程序最常见的方法。midlet套件是一个midlet中所有的文件以及作为 midlet一部分的必需的资源的集合。midlet套件由以下几部分组成:
1、附在jar文件中的 java类文件,
2、描述 jar文件内容的清单文件
3、附在 jar文件中的资源(如图象)和java应用程序描述符文件(jad)
4、应用程序管理器
应用程序管理器是一个移动设备上的软件程序,这个应用程序与具体的设备有关,并且由设备的生产商实现。它负责安装、运行以及从设备上删除 midlet,而提供错误处理支持。这个应用程序管理器同时还提供一个可选界面,允许用户启动、终止以及删除 midlet。
java档案文件
一个商品化的、封装过应用程序通常由许多文件构成。除了 java类以外,其他文件诸如图像和应用程序数据即通常所说的资源,也可能是这个程序包的一部分。你把所有这些信息捆绑进一个整体,就称为 jar文件。
除了类和资源文件,一个 jar文件还包括描述 jar内容的清单文件。清单文件名为 manifest.mf,储存在 jar文件本身中,下面这张表中列出定义在这个清单文件中的所有可用的属性。
| 表 1 | 属性 | 用途 | | midlet-name | midlet程序包的名称。例如“game pack” | | midlet-version | midlet的版本号 | | midlet-vendor | midlet的创建者或提供商 | | midlet-icon | 应用程序管理器把这个图标与 midlet-name相关联,这是一个图形文件,以 png图象格式储存。 | | midlet-description | 描述 midlet的文本 | | midlet-info-url | 可能提供更多midlet和/或供应商信息的 url | | midlet- | 这个属性包括三段信息: ??midlet名称 ??用于这个 midlet的图标(可选) ??应用程序管理器将调用来加载这个 midlet的类名 在我们的“ game pack”例子中,有两个条目: midlet-1: kof, /images/kof.png, kof.kofmidlet midlet-2: golf, /images/golf.png, golfmidlet | | midlet-jar-url | jar文件的 url | | midlet-jar-size | jar文件的大小 | | midlet-data-size | 持久数据存储必需的最小字节数 | | microedition-profile | midlet需要哪一种 j2me简表 | | microedition-configuration | midlet需要哪一种 j2me配置 |
这些属性并不是全部都需要,可是,没有下面列出的这六个,应用程序管理器就会拒绝加载这个 jar。
midlet-name
midlet-version
midlet-vendor
midlet-
microedition-profile
microedition-configuration
这里有一个简单的清单文件的例子:
midlet-name: kof2001
midlet-version: 1.0
midlet-vendor: neorage corporation inc.
midlet-1: kof, /images/kof.png, kof.kofmidlet
microedition-profile: midp-1.0
microedition-configuration: cldc-1.0
java应用程序描述器文件(jad)
虽然没有必要,你仍然可以在 jar文件中包含一个 jad文件,就像清单文件一样,这个文件也包含 midlet的信息。创建一个 jad文件是基于两个原因。
1、向应用程序管理器提供信息,说明 jar文件的内容,使用这些信息,就可以判断一个 midlet是否适合运行在这个设备上。例如,通过查看属性 midlet-data-size,应用程序管理器可以确定 midlet是否需要比设备可以提供的更多的内存。
2、提供一种方法,可以把参数传送到 midlet而不必更改 jar文件,在本文的后半段我们将看一个这样的例子。
jad文件使用表 1中相同的属性。如果你需要创建你自己的属性,也可以办得到,只要使用不以 midlet为开头的属性名就可以了,下面的 showproperties.jad文件就是自定义属性的例子。和清单文件一样,有某些属性必须被定义,如果这些属性不可用的话,应用程序管理器将不加载这个 midlet,它们是:
midlet-name
midlet-version
midlet-vendor
midlet-
midlet-jar-url
midlet-jar-size
midlet-name、midlet-version和midlet-vendor的值必须与 jar中的清单文件中相同的属性的值一致。可能看出,如果在这两个文件有什么不同的话,申请管理器不也会加载这个 jar。
除了这些属性以外,如果两个文件中的另外名称相同的属性,但是属性值不相同的,将优先采取应用程序描述器文件 ( jad )属性。
midp 1.0规范没有规定 midlet-n属性是 jad文件的必需属性。可是,没有这个属性,就没有办法在设备模拟器中预览 midlet。在两个文件中包含这个属性没有问题,并且事实上,那么做可以更清楚看出这些文件是怎样关联的。因此,出于完整性考虑,这里的所有离子都将在jad文件中包含midlet-n属性。因此,出于完整性考虑,这里的全部例子都将在 jad文件中包含 midlet-n属性。
下面是一个非常简单的例子:
midlet-name: note pad
midlet-version: 1.0
midlet-vendor: abc workgroup.
midlet-jar-url: http://www.abcworkgroup.com/midlets/notepad.jar
midlet-jar-size: 26248
midlet-1: notepad, /images/notepad.png, notepad.main
从midlet中访问 jar/jad属性
一个midlet程序可以访问所有的定义在清单文件(在jar文件中)和jad文件的属性。返回属性信息的方法及所在的完整的程序包名是javax.microedition.midlet.midlet.getappproperty(string name)
下面是一个例子,从jar/jad文件中读出并打印属性值。
showproperties.jar中的 manifest.mf文件的内容如下:
midlet-name: show properties midlet midlet-version: 1.0.1 midlet-vendor: abc workgroup. midlet-1: showprops, , showproperties microedition-profile: midp-1.0 microedition-configuration: cldc-1.0 midlet-description: a simple property list example midlet-data-size: 1500 |
showproperties.jad的内容:
midlet-name: show properties midlet midlet-version: 1.0.1 midlet-vendor: abc workgroup. midlet-jar-url: file://showproperties.jar midlet-jar-size: 1132 midlet-1: showprops, , showproperties jadfile-version: 1.5 midlet-data-size: 500 |
showproperties.java的源程序:
import javax.microedition.midlet.*; public class showproperties extends midlet { public void startapp() throws midletstatechangeexception { system.out.println("vendor: " + getappproperty("midlet-vendor")); system.out.println("description: " + getappproperty("midlet-description")); system.out.println("jadfile version: " + getappproperty("jadfile-version")); system.out.println("midlet-data-size: " + getappproperty("midlet-data-size")); } public void pauseapp() { } public void destroyapp(boolean unconditional) { } } |
下面这些是一些比较重要的地方:
manifest.mf文件作为 jar文件 showproperties.jar的一部分储存的。
jad文件showproperties.jad使用midlet-jar-url: file://showproperties.jar 引用showproperties.jar。
当你浏览这个 jad文件的时候,它使用上面那个命令找出相关联的 jar文件并读取清单文件的内容。
属性midlet-name、midlet-version和midlet-vendor 既在 jar中的清单文件中又在 jad文件中,这些属性的值都必须完全相同。
midlet-description属性来自清单文件,是可选的。
jadfile version属性不在表 1中,因此它是一个自定义属性。因为 jad文件内的属性可从midlet访问,所以你可以不用改变 jar文件而添加属性到 jad中。
属性 midlet-data-size在清单文件和 jad文件中都有,就像前面指出的那样,当两个文件中有完全相同的属性时, jad文件中的属性将使用。切记这不适用于midlet-name、midlet-version和midlet-vendor。
在 midlet套件中封装多个 midlet
在我们谈论如何封装多个 midlet之前,我们先得多写几个可用的midlet。下面有两个简单的 midlet。第一个显示一个带有简短消息的文本框组件。
midlet1.java源程序:
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class midlet1 extends midlet implements commandlistener { private display display; // 引用display对象 private textbox tbxmain; // 显示消息的文本框 private command cmdexit; // 退出midlet的命令 // 构造程序 public midlet1() { display = display.getdisplay(this); cmdexit = new command("exit", command.screen, 1); tbxmain = new textbox("midlet 1", "welcome", 50, 0); tbxmain.addcommand(cmdexit); tbxmain.setcommandlistener(this); } // 启动midlet时由应用程序管理器调用 public void startapp() { display.setcurrent(tbxmain); } // 一个必要的方法 public void pauseapp() { } // 一个必要的方法 public void destroyapp(boolean unconditional) { } file://检查一下是否选择exit命令 public void commandaction(command c, displayable s) { if (c == cmdexit) { destroyapp(false); notifydestroyed(); } } } |
第二个midlet使用list组件显示消息(midlet2.java):
import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class midlet2 extends midlet implements commandlistener { private display display; file://引用display对象 private list lstmain; private command cmdexit; // 退出 midlet的命令 // 构造程序 public midlet2() { display = display.getdisplay(this); cmdexit = new command("exit", command.screen, 1); lstmain = new list("midlet 2", choice.implicit); lstmain.append("welcome back", null); lstmain.addcommand(cmdexit); lstmain.setcommandlistener(this); } file://启动midlet时由应用程序管理器调用 public void startapp() { display.setcurrent(lstmain); } file://一个必要的方法 public void pauseapp() { } file://一个必要的方法 public void destroyapp(boolean unconditional) { } file://检查一下是否选择exit命令 public void commandaction(command c, displayable s) { if (c == cmdexit) { destroyapp(false); notifydestroyed(); } } } |
第一个程序名为 midlet1.java,第二个程序名为 midlet2.java。在你保存这些文件的目录里,运行下列命令编译并预验证这些文件。
javac -bootclasspath c:mefcs*.java preverify -classpath c:mefcs;. -d . midlet1 midlet2 jar cvfm midlets.jar manifest.txt midlet1.class midlet2.class spin.png |
创建 jar文件
创建一个新文件,取名为 manifest.txt,然后输入如下内容:
midlet-name: midlet examples midlet-version: 1.0 midlet-vendor: my corporation inc. midlet-1: midlet1, /spin.png, midlet1 midlet-2: midlet2, /spin.png, midlet2 microedition-profile: midp-1.0 microedition-configuration: cldc-1.0 |
运行下列命令创建一个 jar文件:
| jar cvfm midlets.jar manifest.txt midlet1.class midlet2.class spin.png |
这将创建一个名为 midlets.jar的 jar文件,包括 manifest.txt文件和上面两个类文件。
注意: jar中的清单文件名应是 manifest.mf。
创建 jad文件
创建一个新文件,取名 midlets.jad:
midlet-name: midlet examples midlet-version: 1.0 midlet-vendor: my corporation inc. midlet-description: two simple examples to show how to compile and run a midlet midlet-jar-url: http://localhost/midlets.jar midlet-jar-size: 2604 midlet-1: midlet1, /spin.png, midlet1 midlet-2: midlet2, /spin.png, midlet2 |
注意这两个 midlet的引用:
midlet-1: midlet1, /spin.png, midlet1
midlet-2: midlet2, /spin.png, midlet2 |
上面每一行都包括在设备上显示的 midlet名 ( midlet1和 midlet2 );在每个midlet名旁边,应用程序管理器都会显示一个图象文件;以及启动 midlet的类文件。
运行 midlet
你既可以从一个局域网文件系统也可以从一个 web服务器中运行midlet,现在我将分别介绍一下。
从文件系统运行
键入下列命令来预览midlet:
| midp -transient file://midlets.jad |
-transient选项告诉模拟器,你想运行一个指定 url中可找到的描述文件。在本例中,file://midlets.jad,这当前目录查找 midlets.jad。如果有必要的话,你还可以给出一个 jad文件的完整的路径。比如说,我的 jad文件的完整路径是
| file://j2me/midlets/welcome.jad |
下面的图片显示了应用程序管理器的主画面和 midlet1、 midlet2的输出。
从 web服务器上运行
你还可以从一个 web服务器上运行 midlet,在上载 jar和 jad文件之后,通过改变 url访问 jad文件:
| midp -transient http://localhost/midlets.jad |
这将访问运行在我的电脑上的web服务器上的 midlets.jad文件,如果你把文件上传到互联网上的 web服务器,只需简直改变适当域名:
| midp -transient http://www.yourwebserver.com/path/midlets.jad |
使用 java程序包的项目管理
按照下列步骤创建最后一个midlet:
1. 创建用于新项目的目录,我使用的名称为 midletpackage,是c:me的子目录。
2. 在新建目录内,创建三个新的子目录: jclasses、 pclasses、 resources
有了这些附加的目录,能够很容易找到特定的文件。例如,所有的图象文件和其他资源都放入 /resources子目录;所有的由 java编译程序创建的类文件都置于 /jclasses子目录;经过预验证的类置于/pclasses子目录中。下面是我的系统中的目录结构:
c:j2me | midletpackage => java 源代码和manifest.txt文件 | jclasses => 从java编译器编译的类 pclasses =>经过预验证的类 resources =>资源文件 (图像文件等)
|
3. 更新文件:复制 java源文件( midlet1.java和 midlet2.java)到 midletpackage目录,并在每个文件头部添加 package语句,如下:而且,如果你已经使用一个图象文件的话,把这个文件复制进 resources目录中。
midlet1.java: package simplemidlets; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class midlet1 extends midlet implements commandlistener {
...
}
midlet2.java:
package simplemidlets; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class midlet2 extends midlet implements commandlistener
{
...
} |
4、参考图象文件和类文件的新的位置更新 manifest.txt和 jad文件。
manifest.txt: midlet-name: midlet examples midlet-version: 1.0 midlet-vendor: my corporation inc. midlet-1: midlet1, /resources/spin.png, simplemidlets.midlet1 midlet-2: midlet2, /resources/spin.png, simplemidlets.midlet2 microedition-configuration: cldc-1.0 microedition-profile: midp-1.0
midlets.jad: midlet-name: midlet examples midlet-version: 1.0 midlet-vendor: my corporation inc. midlet-description: packaging multiple midlets midlet-jar-url: http://localhost/midlets.jar midlet-jar-size: 2884 midlet-1: midlet1, /resources/spin.png, simplemidlets.midlet1 midlet-2: midlet2, /resources/spin.png, simplemidlets.midlet2 |
注意midlet-1和midlet-2的更改,被引用的类文件使用 simplemidlets.midlet1和 simplemidlets.midlet2包名。
5、编译:编译源程序:
| javac -bootclasspath c:mefcs-d jclasses *.java |
-d选项告诉编译程序,把类文件写入 jclasses目录。
6、预验证:
| preverify -classpath c:mefcs; -d pclasses jclasses |
-d选项告诉预验证器把经过预验证的类保存在 pclasses目录下。最后的 jclasses告诉预验证器到什么地方寻找那些要预验证的类。
7、创建 jar:运行 jar程序:
| jar cvfm midlets.jar manifest.txt -c pclasses . resources |
创建一个名为 midlets.jar的文件,使用文件 manifest.txt作为清单文件的内容 (一个名为 manifest.mf的文件将被保存在 jar中)。
运行midlet,有两种情况:
(1)从文件系统中运行midlet:
| midp -transient file://midlets.jad |
(2)从web服务器上运行midlet:把jar文件和jad文件上传到web服务器,输入下面的命令来浏览midlet:
| midp -transient http://localhost/midlets.jad |
|
|