Java ME
JavaME以往称作J2ME(JavaPlatform,MicroEdition),是为机顶盒、移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的JavaAPI。它和JavaSE、JavaEE一起构成Java技术的三大版本,并且同样是通过JCP(JavaCommunityProcess)制订的。
1、简介
JavaME(JavaPlatform,MicroEdition)是为机顶盒、移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的JavaAPI。它和JavaSE、JavaEE一起构成Java技术的三大版本,并且同样是通过JCP(JavaCommunityProcess)制订的。
JavaME(Java2MicroEdition)是Java2的一个组成部分,它与J2SE、J2EE并称。
根据Sun的定义:JavaME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话和可视电话、数字机顶盒、汽车导航系统等等。JAVAME技术在1999年的JavaOneDeveloperConference大会上正式推出,它把Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。
2、特点
与J2SE和J2EE相比,JAVAME总体的的运行环境和目标更加多样化,但其中每一种产品的用途却更为单一,而且资源限制也更加严格。为了在达到标准化和兼容性的同时尽量满足不同方面的需求,JAVAME的架构分为Configuration、Profile和OptionalPackages(可选包)。它们的组合取舍形成了具体的运行环境。
Configuration主要是对设备纵向的分类,分类依据包括存储和处理能力,其中定义了虚拟机特性和基本的类库。已经标准化的Configuration有-ConnectedLimitedDeviceConfiguration(CLDC)和ConnectedDeviceConfiguration(CDC)。
Profile建立在Configuration基础之上,一起构成了完整的运行环境。它对设备横向分类,针对特定领域细分市场,内容主要包括特定用途的类库和API。CLDC上已经标准化的Profile有MobileInformationDeviceProfile(MIDP)和InformationModuleProfile(IMP),而CDC上标准化的Profile有FoundationProfile(FP)、PersonalBasisProfile(PBP)和PersonalProfile(PP)。
可选包独立于前面两者提供附加的、模块化的和更为多样化的功能。标准化的可选包包括数据库访问、多媒体应用、蓝牙等等。
3、开发工具
开发JavaME程序一般不需要特别的开发工具,开发者只需要装上JavaSDK及下载免费的SunJavaWirelessToolkit2.xx系列开发包,就可以开始编写JavaME程式,编译及测试,此外目前主要的IDE(Eclipse及NetBeans)都支持JavaME的开发,个别的手机开发商如Nokia、SonyEricsson、摩托罗拉、Android系统都有自己的SDK,供开发者再开发出兼容于他们的平台的程序。
4、优化内存
内存占用主要有两种,即程序和资源。
程序类会被编译成class字节码文件随MIDlet的启动加载进内存,而且是一次性全部加入。也就是说MIDlet里类个数越多、单个类程序越长、类内字符串常量及数据越多,编译后的class文件就越大,载入后占用的内存也越多。我经常在MIDlet类的构造函数里用Runtime方法来查看MIDlet启动后整个程序占用内存量。
优化方法:
⒈将MIDlet程序写成两个类来减少内存占用量,但是以牺牲Java的OOP特性为代价的。在程序比较大时这种弊端将尤为显见。而且CoCoMo曾经遇到过单个类过大,载入时间过长而违反百宝箱有关Logo6秒时间限制的情形。
⒉尽量编写优雅的代码,减少函数数量,在程序发布时去掉trycatch,最大限度的减少程序行数,这一般都是在老40上没有办法的办法,现在CoCoMo已经不靠这个来省内存了。
⒊将数据及字符串写进文件,在用时方载入内存,不用时设为null。
⒋I/O操作getClass().getResourceAsStream(file);、数据库操做RecordStore.openRecordStore(name,true);、声音创建Manager.createPlayer();、图像创建Image.createImage(file);会在短时间内占用大量内存且过后释放,如果MIDlet程序内存剩余量不足则会在这些函数频繁调用时发生内存溢出,产生所谓的内存峰值,尤其在老40上比较普遍。当再次与OutOfMemoryError碰面时,多用Runtime查找内存峰值发生位置并尽量将这些语句分开调用,并灵活运用System.gc()来及时回收。
资源
图片:是占用内存的大户,尤其是手机游戏图片资源众多。对图片资源在内存中占用量的计算成为J2ME游戏开发者的经常性工作,CoCoMo来解释一下如何计算图片在内存中的占用量:
内存占用量=宽*高*像素字节数,其中像素字节数因机型而异。
例如一张64*64的图片在7210上的内存占用量=64*64*1.5=6144(字节)=6K、在S60上的内存占用量=64*64*2=8192(字节)=8K。像素字节数因机型而异,例如7210是4096色机型,也就是说用12位来表示一个像素,所以乘上1.5,而S60是65536色的机型,用16位来表示一个像素,所以乘上2。
优化方法:
认为压缩图片可以节省内存,这种想法是错误的。根据上面的解释图片载入内存后只和宽高有关系,和图片数据量大小没有任何关系,压缩图片只能减少jar大小而不能减少内存占用量。
⒈静态法:减小图片大小,宽高小了结果当然小了。根据这个思路出现了动画编辑器之类的工具,像gameloft的波斯王子,人物被分割后使人体的部位可以重用,各部位紧凑放置都是为了较少图片大小,充分利用图片中的每一寸空间。
⒉动态法:减少同一时刻载入内存的图片数。CoCoMo曾经在火影武士项目中遇到过这种情况,当时有6种怪物,如果同时载入内存在老40上肯定爆掉了,但是每关只出现两到三种怪物,所以每一关只需要载入该关出现的怪物图片即可。现在想起来当时做这个项目在老40上溢出频出,真把我搞死了。
声音:声音也是比较耗用内存的资源,声音中音轨所占的byte会转化成字节流被载入到内存中。因而减少音轨所占byte即可减少内存耗用量。目前gameloft的做法是用声音转化工具将mid转化为ott,然后变为ByteArrayInputStream字节流来创建Player。
5、数字签名
随着国家3g牌照的发放,手机游戏市场再度成为业界关注的焦点。上周,业界相关人士表示,中国手机游戏市场经过几年的市场培育,市场开发已渐成熟,3g时代的到来将使中国手机游戏市场规模将大幅度增长,一场手机游戏盛宴有望上演。3g时代的到来,网络宽带的速度将大幅提升,那么手机游戏带给用户的将又是一种全新的体验,大家体验越来越好的时候,这个经济一定会越来越热。因此可以预见3g时代到来的时候,手机游戏一定会成为主流之一。从手机游戏的几年发展不难看出,从简单内置的手机游戏到下载类游戏,再到联网游戏、多人联网游戏,最后发展到跨平台联网游戏,手机游戏产业正不断升级,随着3g时代的到来,对于手机游戏来说,意味着更强的终端表现力、更快的传输速度,全新的体验将使它吸引更多的用户加入进来。
得到一个证书后就可以对JavaME的jad文件进行签名。这里有一些与签名相关的需要注意的一些问题:
⒈想要安装签过名的软件,就必须通过jad来安装。
我们知道JavaME程序生成后会有jad和jar两个文件,一般情况下我们只需要安装jar文件就可以了。例如我会将jar文件通过蓝牙传到手机上,再进行安装。但如果想通过手动安装签过名的文件,就要通过jad来安装,而且要确保jad和jar文件是在相同目录下。我的做法是通过数据线将两个文件拷入手机的内存或存储卡上,然后通过jad来安装,这样安装好的软件就是签过名的软件了。不会再有总是很烦人的询问用户是否允许操作的提示信息。
但就我看过的手机看来,应该是不同的手机有不同的表现。例如索爱的手机关于提示仍然是需要用户自己设置的。诺基亚也是。只是诺基亚的在使用非签名软件时用户无法设置为“总是允许”或“只提示一次”。而签了名的就可以设置了。
⒉编程人员需要注意,像很多功能在未签名前是可以使用的,例如gps,网络连接,文件读写等。
⒊签过名的软件有什么好处。
签名就是告诉我们这个软件是可信的,对用户最直接的感受就是联网或访问手机文件的时候,收发短信,彩信,蓝牙等,但签名后这些功能就不可用了。
这就是jad中MIDlet-Permissions属性的问题。当未签名时对这个属性的要求并不严格,但签名后就一定要注意。必须把所要使用到的权限加入进去,否则这个功能就不能使用了。