J2ME--丰富多彩的领域中生机勃勃的技术
|
|
Author: 一滴蔚蓝色 | Date: 2007-08-08 |
View: 1814 |
开发技术 - 新手上路 | Digg:
1
|
|
内容: J2ME的由来 Also in the Java zone: 教学 董向辉 (dracodoc@hotmail.com) 明天的计算将进入普及计算时代。各种消费电子产品,包括智能手机,PDA,Web-TV,将来的信息家电等等将实现随时随地的计算。这是一个异常广阔和丰富多彩的领域,其设备极度多样化而且都将在网络中,Java技术的跨平台性和网络功能在这里大有用武之地。这就是J2ME,这一丰富多彩的领域中生机勃勃的技术。但是,这一领域的多样性和J2ME标准的复杂性很容易让初次接触者困惑。如果他试图写一个能在自己的PDA上运行的程序,很有可能会遇到许多困难,因为已有的旧的技术很有可能会被放弃,真正适合PDA的标准尚未完成,多种多样的标准和技术本身也在迅速发展变化。为此,本文的重点不在于具体的编码细节,而在于从概念上更准确地表述J2ME的体系结构,帮助读者理解和把握这些复杂的标准。并且从宏观上描述平台和标准的发展,分析在移动信息设备上开发J2ME应用的现状和前景,尽量让读者能够从全局上把握复杂的局势,为将来的发展做好准备。 网络是这个领域最重要的增值特性。当手机可以随时随地无线上网,PDA可以和个人PC同步,车载PC可以获得网上GPS地图数据时,这些孤立的设备才能够发挥最大的作用。 而平台无关性和网络功能正是Java的设计目标和能力(事实上,Java最初的设计目标就是用于消费电子领域,但是后来在PC和服务器上得到了发展)。"一次编写,到处运行"的平台无关性,对网络,多重设备间联网的机制(JINI)显然对这个领域是至关重要的软件条件。这个领域内的Java标准就是J2ME。 J2ME的由来 Java的最大目标和特点,就是"一次编写,到处运行"的平台无关性。但是,很自然的,正如Sun认识到的,"One size does′nt fit all",一套标准无法适应各种不同的需求。因此,Java技术目前共有三套,分别针对不同的平台和应用。 Standard Edition (J2SE,标准版):针对桌面端PC和工作站的个人和低端商务应用。 注:Java SDK 1.2及以后的版本都统一改名为Java 2,因此这些名字中都有2。
J2ME体系结构??Configuration和Profiles 针对消费电子和嵌入式设备领域丰富多样的设备和彼此相差极大的计算能力及各种硬件条件,J2ME首先根据最基本的一些特征把它们划分为两类。 具备间断网络通讯能力的个人移动信息设备:如手机,双向呼机,PDA(Personal Digital Assistant,个人数字助理,也称掌上电脑)等等。 计算能力是这两类设备的主要区别,对其上可能的应用和环境显然有着本质影响,不同类别的设备不可能采用同样的Java平台,必须分别定义。针对这两大类设备的平台规范就是Configuration(有译为配置的,不过我认为最好不译)。第一类设备的Configuration称为CLDC(Connected, Limited Device Configuration),第二类称为CDC(Connected Device Configuration)。 属于同一类的设备计算能力是相似的,但是其他功能和条件还有非常大的区别。作为Java平台必须保证相容性,这就必须舍弃所有的设备特殊性。因此,Configuration就是支持一组通用设备的最小Java平台,作为这些设备的最小公分母来保证不同设备间的平台相容性。这里的Java平台主要是指Java虚拟机(JVM)和核心库。 在Configuration中舍弃了设备的特殊性来保证Java平台的相容性,但是仅仅有Configuration显然是不够的,特殊的具体设备其独有的功能和硬件条件都没有得到支持。为此,在Configuration的基础上,根据设备具体功能再进行一次划分,比如智能手机,PDA等等。功能的划分也就是其他硬件条件的划分,比如屏幕大小,内存,计算能力,电力供应等等都是从属于功能的,因此同功能的设备的硬件条件都是非常相似的。Profile(译为简表或者简档)就是针对每一类功能设备的特殊性定义的与设备特性相关的API,建筑于Configuration之上,作为Configuration的扩展和补充。例如MIDP(Mobile Information Device Profile,移动信息设备Profile)就定义了关于移动信息设备(主要指智能手机和一部分具有无线通信功能的PDA)的图形界面,输入和时间处理,持久性存储,短消息等等的API,并且考虑到了移动信息设备的屏幕和内存限制。而正在制定中的PDA Profile则定义了针对PDA的API,其屏幕,内存条件都要大于MIDP,但是网络方面的要求则显然和手机有所不同。如下图所示,同属于一个Configuration的设备根据功能不同由不同的Profile来支持,Profile体现设备的特殊性,但是都建筑在一个共同的基础Configuration平台之上。
Configuration的分类是根据计算能力的不同来划分的,同类设备的计算能力相近。Configuration是一个规范,定义了这类设备的共同Java平台,定义与设备无关的Java虚拟机和核心库,是平台相容性的基础。Profile的分类是根据设备功能划分的,同类功能的设备其他各种硬件条件和需求也相近。Profile是一组API,在某一Configuration的基础上扩展了针对设备特定功能的API,使得标准能够完全适应特殊的设备,彻底发挥设备的功能。 J2ME体系的一般结构是:由Configuration定义的Java虚拟机运行于设备的宿主操作系统之上,构成整个平台的基础。Configuration提供了基本的语言特性,Profile提供针对设备的特殊功能API和扩展类库。应用程序的运行环境需要一个Configuration和至少一个Profile,多个Profile可以共存,也可以叠加。 我们用两个具体设备的实现作为例子说明。在一个运行Palm OS的PDA上,Configuration采用CLDC,虚拟机采用KVM(虚拟机和Configuration是紧密相连的,KVM只是CLDC定义的一个参考实现(reference implementation),并不是唯一的选择),然后采用PDA Profile的Profile。在另一个运行Symbian的智能手机上,则可以采用KVM,CLDC,MIDP。
J2ME主要标准简介 J2ME的标准很多,其中许多细节凡是关于J2ME的文章都会介绍,这里我们只简要介绍几个基本而重要的标准。读者也可以直接去查标准的正式文档,在JCP网站可以找到所有J2ME标准和规范,包括还在提出和审核阶段,没有正式成为标准的提案。 虽然J2ME标准繁多,但只要把握住标准划分的原因就很容易掌握。在这个技术飞速发展的领域,我们不能把眼光局限于标准的字面含义,而要灵活掌握,把握其精神。比如,CLDC和CDC的定义中具体的最小内存需求仅仅是"最小的",随着硬件能力的飞速发展,很有可能一些界限会变得模糊。PDA本来应该属于CLDC的范围,但是Compaq的iPaq上却实现了CDC。以后的下一代PDA有64M内存并不意外,在其上实现CDC也是完全可能的。但是,从功能的角度,应该还是CLDC以及PDA Profile更适合于PDA的条件。到那时,具体的实现就要看厂商和开发者的选择了。还需要注意的是,由于Profile是建于Configuration之上,作为对Configuration的扩展,因此Profile必须Configuration的支持。有的文章在讲到MIDP的内存需求时,说MIDP需要最少256K,这是指MIDP本身。而有的文章说MIDP需要最少768K,那时因为把作为基础的CLDC所需要的512K算进去了。 CLDC CLDC(Connected, Limited Device Configuration)针对个人化的移动的有限连接信息设备,例如智能手机,双向呼机,PDA等等。其要求是: 512 KB 以下内存 包 描述 类和接口数目
CLDC必须照顾最苛刻的硬件条件,因此去掉了许多重要的类和特征,只保留了最核心的一些基本类。例如RMI和映射因需要内存太多而被舍弃,错误处理要求的代价太高,也被删除了。许多设备不能支持浮点数,更不用说双精度类了。还有许多设备没有或不提供访问一个文件系统的功能或权限。不过请放心,对于那些能够支持更多特征的设备,它们所需要的这些功能或者超出标准J2SE要求的功能,都可以由针对此类设备的Profile来补充。 CLDC中唯一新增的javax.microedition包定义了一个通用连接框架(Generic Connection Framework,GCF)。通用连接框架把J2SE中的文件,sockets,HTTP请求和其他输入/输出机制的概念抽象为更简单的一套类。可以说,它提供了java.io和java.net的同样功能,却不需要设备的特殊能力。与底层操作系统无关是Configuration的基本要求。通用连接框架可以看成是构造通讯驱动的框架,这一点类似于J2SE中的JDBC,后者是一个构造数据库驱动的框架。通用连接框架并没有定义对任何特定协议的支持,但是在Sun的一个CLDC参考实现中确实包括了对一些通讯协议的支持,这点使许多人感到困惑。那些协议只是一些例子,协议的支持应该在Profile层或者专门针对某设备的扩展中定义。 由于虚拟机处于Configuration中定义平台的核心,Configuration和虚拟机是紧密相关的。既然CLDC的硬件要求如此苛刻,对其虚拟机也就有着非常高的要求。Sun提供的参考实现是KVM(K Virtual Machine)。KVM是完全从头开始编写的,其设计目标包括: 虚拟机的大小和类库为50到80KB左右 由于这一历史原因,造成了很多名词上的困扰。许多早期的文章把这一KVM与com.sun.kjava包合称为KVM,表示这一技术,而现在所说的KVM应该是单单指Sun的CLDC虚拟机参考实现。甚至还有人用K Java作为J2ME的代称,表示基于KVM的Java,这很容易和正式的J2ME标准以及早期的com.sun.kjava包相混淆,读者在看这类文章时需要注意文章的时间和背景,并采用严格的正式名称。 目前Sun还正在开发KVM的一个高性能版本--Project Monty虚拟机以用于下一代的移动信息处理设备。它采用了Hot Spot的技术,性能将比现有的KVM将近高一个数量级。 虽然KVM作为Sun的参考实现最经常被提到,不过并不等于一定要用KVM。其它公司的虚拟机只要满足相应的Configuration里的定义,通过兼容性测试,一样可以作为Configuration的虚拟机。目前IBM WebSphere Micro Environment,已经通过了"Java PoweredTM"认证,其J9虚拟机在相当多的平台上通过了J2ME兼容性测试:
MIDP MIDP(Mobile Information Device Profile)定义了针对移动信息处理设备(主要指智能手机和一部分具有无线通信功能的PDA)的图形界面,输入和时间处理,持久性存储,无线电话网络连接之上的一些消息处理(例如短消息),安全等等API,并且考虑到了移动信息设备的屏幕和内存限制。类似于J2SE中的Applet框架,MIDP提供了基于javax.microedition.midlet 包的MIDlet应用程序框架。 由于MIDP提出较早,目前重要的智能手机和PDA操作系统上都已有了相应的实现(后面将简要介绍这些操作系统),网上也有许多教程与文章,一般所谓的Wireless应用文章都是关于MIDP的,这里就不再重复了,读者可以参考文末的资源。 PDA Profile PDA Profile将在CLDC的基础上,提供针对PDA的用户界面,数据存储等扩展API。用户界面部分适用于有限大小和色彩的显示,为了支持开发者已有的经验基础,将是AWT的一个子集,也有可能在AWT子集之上加入MIDP用户界面组件。而存储机制将是简单的,平台无关的,类似于MIDP中的存储,为应用程序、数据、配置/环境信息提供简单的数据存储。 目前这一规范正由Palm Source公司(从Palm公司分离出来的专门负责Palm OS的公司)领导主持,已经在4月8日开始进入了JCP流程的第二阶段Community Draft最后部分(Community Draft Ballot 08 Apr, 2002 ),估计最终正式版本应该在7月至9月左右完成。(参考http://jcp.org/introduction/timeline/index.en.jsp)前面已经提到,PDA Profile将取代 k java,作为针对PDA的正式J2ME标准。因此建议希望在PDA上开发应用的开发者等待这个标准的出台和相应的实现,现在如果要进行MIDP的应用开发,则应明确其目标是智能手机类的设备,而不是PDA,这一点很多文章都没有讲清楚。 CDC CDC(Connected Device Configuration)针对有固定的不间断网络连接的共享连接信息设备,如置顶盒(set-top boxes),Web-TV,支持Internet的有屏幕电话,汽车娱乐/导航系统等等。 CDC要求为Java提供至少2M的内存,这可以是ROM加上RAM,也就是说,Java虚拟机和核心类库很有可能放在ROM或者Flash里。事实上,下一代无线手持设备完全可以满足CDC的需求。 CDC是CLDC的完整超集,包含了所有的CLDC规范。另外,在相对充裕的条件下,它支持J2SE的标准 Java 虚拟机和一部分核心类库。对于这一点,几乎所有的文章都这么说,却很少有文章彻底分清彼此之间的兼容性关系,甚至还有文章错误地说CDC支持Java语言的完整实现,这是很容易引起混淆的。 首先可以肯定,既然CDC是CLDC的超集,基于CLDC的程序在CDC内是完全兼容的。不过这里的CLDC程序必须只用到CLDC的部分,一旦采用了某一个Profile,显然也就不能在CDC内兼容了。
其次,CDC支持标准的J2SE虚拟机,这只是Java平台的基础,并不包括建筑于平台基础之上的各种类库。特定设备需要的特定类库由相应的Profile来定义。这一点随后就会提到。还是那个关键:Configuration定义的是一类设备的与设备无关的最小平台,因此,诸如用户界面之类的类都被分离,留在Profile中定义。 虽然CDC支持标准的J2SE虚拟机,但是标准的Java虚拟机显然无法适应有限的资源环境。为此需要专门定义一个虚拟机,称为CVM(开始的时候,CVM代表Compact Virtual Machine,但是后来Sun的工程师认为这有可能与KVM相混淆,因此现在C并不代表特定的含义)。CVM除了支持标准J2SE虚拟机的所有特性外,还支持许多嵌入系统需要的特性,更适合于在资源限制条件下运行,移植性很强。目前Sun提供了Linux和VxWorks之上的CVM参考实现(reference implementation)。 Foundation Profile Foundation Profile提供除了用户界面以外CDC所缺少的几乎所有标准J2SE核心类库,作为其他所有Profiles的基础(我们看到,多个Profile可以共存,也可以叠加)。 Personal Profile Personal Profile针对那些资源相对有限,但是需要高度的Internet和WEB连接支持的设备,例如Web-TV,汽车导航系统等等。它在Foundation Profile的基础上提供了网络特性以及支持Java applets的 GUI。 Personal Profile的前身是Personal Java,Personal Java是Sun为资源限制设备创建 Java 平台版本的早期尝试。Personal Profile将与Personal Java 1.1和1.2向后兼容。 RMI Profile RMI Profile在Foundation Profile的基础上提供RMI支持,将允许网络设备与其它系统应用程序(不一定是J2ME的)交互操作。 J2ME的平台无关性和标准的兼容性 平台无关性主要指的是设备的宿主操作系统平台。由于Java平台建筑于虚拟机之上,只要不同的操作系统上的虚拟机满足同样的规范和标准,对于虚拟机以上的层次是平台无关的。这使得针对某一Configuration或者Profile的应用可以运行于所有实现了这一Configuration或者Profile的操作系统平台。举例来说,目前已经有网站开始收集基于MIDP的程序??MIDlet,提供下载和收费,各种支持MIDP的设备都可以使用,这包括数量巨大的智能手机和几乎所有的PDA(Palm OS和Pocket PC)。 对于Profile而言,不同的Profile之间一般是不相容的,比如日本NTT 的DoCoMo已经销售了相当多的支持CLDC的手机,但是使用的是自己专用的Profile,针对这一Profile的程序对其他Profile也就是不兼容的。事实上,由于Profile是针对设备功能的,不同的Profile针对的设备,往往功能上有着较大差别,程序的相容性既不可能也无太大意义。当然有一些设备的功能划分不那么明确,比如有无线通信功能的PDA和智能手机。由于一个Configuration之上可以同时有多个Profile,Profile之间也可以嵌套和叠加,例如CDC的Foundation Profile就是其他各种Profile的基础。那么这些设备就既可以采用MIDP也可以采用PDAP,在以后的硬件基础上,同时装多个Profile也完全没有问题。 有的文章里说,J2ME为了能够在计算能力有限的设备上运行,舍弃了J2SE的许多特性,因此J2ME是J2SE的子集。这样的说法没有强调J2ME里因为设备特殊性而增加的内容,因而是不准确的。除非程序只用到这些平台间共同的部分,否则是不能相容的。而一般来说,共同的部分是相当有限的。 其他非J2ME标准的相关技术 还有一些技术和J2ME相关,但是并不属于J2ME,我们在这里作简要介绍。 Java Card Java卡(Java Card)是为智能卡(smart cards)设计的。Smart cards的内存非常有限,为此限制了类的数目(例如,没有Windows系统类),并把整个Java Card规范在一个二进制核心里实现,然后用Java封装。由于智能卡的功能很简单而容易掌握,类不需要频繁改变,这一方法效果很好(对于J2ME显然不能使用这种方法)。另外,由于每一个Java卡应用的数据和代码是独立在沙箱(sand box)内执行的,一张卡上可以有多个应用,彼此独立,并且很安全,这样就实现了一卡多用,不需要在钱包里装太多的卡。 虽然Java卡是为智能卡设计的,不过也可以用于许多其他地方。例如1998年的Java One大会上的Java戒指(Java Ring,又名 Java-Powered iButton,事实上只是Java Card的另外一种型态,Dallas Semiconductor公司将它制作成为钮扣的形状,进而镶嵌在戒指之上),或者世界上现在发布的数百万张GSM SIM卡。 Embedded Java Embedded Java是历史上Sun另一次创立嵌入系统Java平台的尝试,针对有间断的网络连接或者没有网络连接的设备,这些设备经常是没有图形界面的。Embedded Java的设计更接近于J2SE,但是因此太大太慢,而且对系统要求过高。另外,Embedded Java将控制其运行的平台,也就是接管所有的系统调用,所有的库,所有的设备。显然提供平台的公司不会喜欢这一点。因此,Embedded Java基本上完全失败了。 WAP WAP(Wireless Application Protocol,无线应用协议)是XML的一个应用,其目的是在无线设备如手机上显示Internet内容。由于无线设备的显示区域有限,需要将标准的HTML重新调整以适应硬件条件。 许多初听说J2ME的人都会想到WAP,其实WAP和J2ME并不冲突,而且是很好的互补。WAP对于文本为主的内容是很合适的,需要持续的网络连接。但是对于图形较多的应用WAP就不太合适,只能提供轻量级的脚本执行能力。WAP的网关也有安全性问题。而Java技术可以用于间断的网络连接,可以将应用和服务逻辑在设备和服务器间分离,很适合于图形应用,有很稳定而可靠的安全模型。 结合WAP和Java技术的一个方法是在设备上安装一个WAP浏览器,并且实现CLDC和MIDP及其与WAP浏览器之间的通讯。也有一些WAP技术是用Java实现的,比如K Browser(http://www.4thpass.com)就是一个用Java实现的浏览器,运行于J2ME之上。 无线Java技术 无线这个概念在J2ME的相关文章中经常出现,但是 无线Java不等于J2ME。J2ME中,无线设备只是其中的一小部分。而无线Java技术也可能包括这种情况:在笔记本上运行J2SE应用,通过802.11 LAN连接网络。 在消费电子和嵌入式设备的广阔领域中,目前最受关注的是移动信息设备,因此有必要介绍一下移动信息设备的主要操作系统平台,这对J2ME的开发是相当重要的。移动信息设备主要包括PDA和智能手机,现在和将来都还会有一部分设备处于PDA和智能手机交界的位置。其中手机的市场远比PDA要大得多,所以许多国外谈到J2ME的文章都是以Wireless应用为主。 PDA也即掌上电脑,一般是指类似于Palm公司出品的Palm这样的设备,主要的操作系统有Palm OS和Pocket C两大阵营。Palm OS来自Palm公司,是一个开放的系统,在PDA市场上占主导地位,已经有非常多的第三方厂商开发的应用和一大批非常忠实和狂热的用户。目前采用Palm OS的主要有Palm公司的Palm系列和Sony公司的Clie系列(Handspring公司的Visor也属于这类产品,但是已经宣布退出传统PDA市场,主要发展PDA和无线通讯结合的产品Treo)。 Pocket PC是微软及其合作伙伴Casio、Compaq、Hewlett Packard和Symbol推出的,基于Win CE 3.0,也是一个开放的标准系统,功能可以扩展(以往的Win CE是一个封闭的不可扩展的系统),在这个平台上厂商可以自己开发软件。具体产品如Compaq的iPAQ。 另外,Sharp公司Zaurus系列PDA采用Linux的一个针对嵌入式系统的版本。作为拥有高达64M内存的高端PDA,可以满足CDC的标准,预装了Personal Java的虚拟机。 在智能手机领域,主要的平台是Symbian的EPOC。EPOC最早由Psion开发,主要面向智能手机,也有PDA的特征,Psion就是第一批主要的PDA厂商之一。Psion宣布EPOC的第一个版本是开放的OS,并向其它厂商授权,随后Psion与Ericsson,Nokia,及稍后的Motorola建立了名为"Symbian"的联盟,目前主要股东为Motorola, Nokia, Panasonic, Psion和SonyEricsson,而且Siemens4月也宣布加入。Symbian在欧洲有很好的基础,为大多数主要手机厂商所采用,典型的产品如Norkia的9210。
图5:Norkia 9210 Symbian向领先的软硬件开发商开放源代码--所谓的Platinum Programme。从Symbian OS 5起开始支持java,OS 6引入了Personal Java和Java Phone(在Personal Java基础上的一个扩展API,主要针对手机),OS 7开始支持CLDC和MIDP(部分基于6.0和6.1的产品也支持)。
移动信息设备上J2ME开发的现状和前景 在前面提到的这些操作系统平台中,Palm OS上已经有了MIDP的参考实现,但是并不是最适合PDA的Profile。Symbian实现了CLDC和MIDP,作为智能手机的操作系统,是理想的MIDP应用平台。在Compaq的iPaq上已经实现了CDC(基于Pocket PC),另外前面提到过,IBM的WebSphere Micro Environment在Pocket PC上实现了CLDC,CDC和MIDP。Sharp的Zaurus实现了Personal Java(基于Linux)。可以看到,在硬件条件较好的PDA上(Pocket PC和Zaurus都使用Intel Arm CPU,比Palm使用的Motorola DragonBall系列性能要高得多)都可以实现CDC的标准。由于这些主要操作系统平台都是开放的,基本可以相信,主要的移动信息设备操作系统都将一直提供J2ME的支持,但是具体支持哪个标准则并不一定死板地按照CLDC和CDC的最初定义,和设备的硬件条件和厂商的选择有关,或者可能同时实现多个标准。 关于移动信息设备上J2ME应用的具体开发,现有的文章和技术基本分为以下几类: 采用早期的KVM和com.sun.kjava包,或者加上第三方的k awt类库。有很多早期的文章和代码,但是这一技术将被PDA Profile取代,而且不保证兼容性,不建议开发者采用这一方法,而是等待PDA Profile的最后完成及其实现。 空间:现在一般的Palm类设备内存从2M到16M不等(目前较高档的机型都已支持扩展卡,可以扩展到128M,但是卡上运行程序的速度要慢得多,一般主要用来放数据,运行程序不能依赖于卡),Palm上一般现有程序的标准大小是几十K到300K以下。而仅MIDP的Palm参考实现库在Palm上就需要将近600K,再加上作为基础的CLDC库,加上程序,就快要接近1M了。和已有的应用相比,目前是没有太大竞争力的。 硬件的发展:目前的Palm配8M到16M内存已经是主流,下一代超过32M是必然的趋势。Palm OS 5终于开始支持32位的ARM RISC处理器,其速度应该能够提高10倍以上。事实上,Sharp公司今年第一季度发售的Zaurus SL-5500已经采用了Intel 206MHz StrongARM处理器和64M内存,在这样的硬件上速度和内存都不会成为问题。 J2ME牵涉到的内容相当多,这里详细列出各方面的重要站点。 J2ME的官方网站: http://jcp.org,Java Community Process(JCP)。虽然Sun是Java的创始人,但是现在Java平台的许多定义和扩展工作是通过JCP进行的。JCP允许公司和个人参与到Java平台的定义和修改工作中来,其流程很简单,先提交一个扩展Java平台的规范需求(java specification request, JSR),如果被接受,就组成一个专家组正式定义这个JSR。专家组的成员包括该领域的专家和志愿奉献精力和时间者。下一步就公布出来接受其他JCP成员和公众审查,根据审查意见修改后,就投票接受为一个正式的Java标准。这一过程能够保证Java的各种实现是兼容的,从而保证Java应用的相容性。所有的J2ME标准都是通过这个流程定义的。 http://wireless.java.sun.com,有大量的教程和文章,主要针对无线Java技术。其中 Bill Day的J2ME资源,http://www.billday.com/j2me,非常全面,但是初接触者看的话可能会觉得重点不太突出。Bill Day是Sun在J2ME方面的资深专家,其文章很有价值。 developerWorks 中国网站的另外两篇关于J2ME的文章 http://archives.java.sun.com/archives/kvm-interest.html,虽然名字是KVM,但是实际上讨论关于J2ME的一切话题。有许多Sun的工程师和其他专家,J2ME的实际开发者积极参与讨论。 前面提到的Bill Day的J2ME资源中列出了主要的J2ME相关英文书籍。 更多阅读: |
尚无评论发表