标题：Java ME
简介
Java ME(Java Platform,Micro Edition）是为机顶盒、移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台，包括虚拟机和一系列标准化的Java API。它和Java SE、Java EE一起构成Java技术的三大版本，并且同样是通过JCP（Java Community Process）制订的。　[1]　
Java ME(Java 2 Micro Edition）是Java 2的一个组成部分，它与J2SE、J2EE并称。
根据Sun的定义：Java ME是一种高度优化的Java运行环境，主要针对消费类电子设备的，例如蜂窝电话和可视电话、数字机顶盒、汽车导航系统等等。JAVA ME技术在1999年的JavaOne Developer Conference大会上正式推出，它将Java语言的与平台无关的特性移植到小型电子设备上，允许移动无线设备之间共享应用程序。
特点
与J2SE和J2EE相比，JAVA ME总体的的运行环境和目标更加多样化，但其中每一种产品的用途却更为单一，而且资源限制也更加严格。为了在达到标准化和兼容性的同时尽量满足不同方面的需求，JAVA ME的架构分为Configuration、Profile和Optional Packages（可选包）。它们的组合取舍形成了具体的运行环境。
Configuration主要是对设备纵向的分类，分类依据包括存储和处理能力，其中定义了虚拟机特性和基本的类库。已经标准化的Configuration有- Connected Limited Device Configuration（CLDC）和Connected Device Configuration(CDC）。
Profile建立在Configuration基础之上，一起构成了完整的运行环境。它对设备横向分类，针对特定领域细分市场，内容主要包括特定用途的类库和API。CLDC上已经标准化的Profile有Mobile Information Device Profile (MIDP）和Information Module Profile（IMP），而CDC上标准化的Profile有Foundation Profile(FP）、Personal Basis Profile(PBP）和Personal Profile(PP）。
可选包独立于前面两者提供附加的、模块化的和更为多样化的功能。目前标准化的可选包包括数据库访问、多媒体应用、蓝牙等等。
设计规格
J2ME 在设计其规格的时候，遵循着「对于各种不同的装置而造出一个  Java ME书籍单一的开发系统是没有意义的事」这个基本原则。于是 JAVA ME 先将所有的嵌入式装置大体上区分为两种 ：一种是运算功能有限、电力供应也有限的嵌入式装置（比方说PDA 、手机）；另外一种则是运算能力相对较佳、并且在电力供应上相对比较充足的嵌入式装置 （比方说冷气机、电冰箱、电视机顶盒 (set-top box））。因为这两种型态的嵌入式装置，所以Java 引入了一个叫做Configuration 的概念，然后把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC）规格之中；而另外一种装置则规范为 Connected Device Configuration(CDC）规格。也就是说， JAVA ME 先把所有的嵌入式装置利用Configuration 的概念区隔成两种抽象的型态。
其实在这里大家可以把Configuration 当作是JAVA ME 对于两种类型嵌入式装置的规格，而这些规格之中定义了这些装置至少要符合的运算能力、供电能力、记忆体大小等规范，同时也定了一组在这些装置上执行的 Java 程序所能使用的类别函式库、这些规范之中所定义的类别函式库为 Java 标准核心类别函式库的子集合以及与该型态装置特性相符的扩充类别函式库。比方就CLDC 的规范来说，可以支援的核心类别函式库为java.lang.* 、java io.*、java.util.*，而支援的扩充类别函式库为javamicroeditionio.*。区分出两种主要的Configuration 之後，JAVA ME 接著在定义出Profile的概念。Profile 是架构在Configuration 之上的规格。之所以有Profile的概念，是为了要更明确地区分出各种嵌入式装置上Java 程序该如何开发以及它们应该具有哪些功能。因此Profile 之中定义了与特定嵌入式装置非常相关的扩充类别函式库，而 Java 程序在各种嵌入式装置上的使用者介面该如何呈现就是定义在Profile 里头。Profile 之中所定义的扩充类别函式库是根据底层Configuration 内所定义的核心类别函式库所建立。
开发工具
开发Java ME程序一般不需要特别的开发工具， 开发者只需要装上  Java开发工具Java SDK 及下载免费的 Sun Java Wireless Toolkit 2.xx系列开发包，就可以开始编写Java ME程式，编译及测试， 此外目前主要的IDE(Eclipse 及 NetBeans）都支持 Java ME 的开发，个别的手机开发商如 Nokia 、Sony Ericsson、摩托罗拉、Android系统 都有自己的SDK， 供开发者再开发出兼容于他们的平台的程序。
Java ME游戏
研究背景游戏作为人们日常生活的一个重要的娱乐项目，也带动了巨大的游戏相关产业市场的发展。游戏平台从游戏机、电视游戏，到pc游戏，到手机游戏，中间经历了很多的技术的变革。随着新技术的发展和人们生活水平的提高，手机开始逐渐普及，手机以其小巧便捷，方便的特性成为人们的必备通讯工具。而基于手机平台的手机游戏也就拥有了巨大的市场空间，随着3g的开通和应用，手机游戏必将迎来新的一轮游戏热潮！手机游戏概述手机游戏可以根据游戏本身的不同，而分成文字类游戏和图形类游戏两种。
文字类游戏：
文字类游戏是以文字交换为游戏形式的游戏。这种游戏一般都是通过玩家按照游戏本身发给您的手机的提示，来回复相应信息进行的游戏。举一个简单的例子，目前很知名的短信游戏“虚拟宠物”就是典型的文字类游戏。在游戏中，游戏服务商会给您一些短信提示，比如服务商可能会给你发送如下短信“您的宠物饥饿度：70，饥渴度：20，疲劳度：20，喂食请回复内容为数字‘1’的信息，喂水请回复内容为数字‘2’的信息，休息请回复数字‘3’……”等等，那么，您回复数字“1”之后，游戏会给您回一个信息“您的宠物已经喂食完毕，您的宠物的饥饿度变为20”，如此类推，您便可以通过手机短信的方法来进行游戏了。
文字类游戏主要分为两种：
a，短信游戏 
b，wap浏览器游戏 
a，短信类游戏：
就好像“虚拟宠物”那样。短信游戏是通过玩家和游戏服务商通过短信中的文字的内容来交流，达到进行游戏的目的的一种文字游戏。
由于短信游戏的整个游戏过程都是通过文字来表达，造成短信游戏的娱乐性较差。但是短信游戏却是兼容性最好的手机游戏之一。只要您的手机可以发短信，您就可以畅快的享受短信游戏给您带来的快乐了。
b，wap浏览器游戏：
wap是一种手机拨号上网的网络服务。而wap浏览器游戏就好像我们用电脑上网，并通过浏览器浏览网页来进行的简单游戏一样，也属于一种文字游戏。其进行方法和短信游戏类似，玩家可以根据wap浏览器浏览到的页面上的提示，通过选择各种不同的选项的方法来进行游戏。wap游戏也有短信游戏不够直观的缺点。
综观文字类游戏，其都有着一个共同的特点，即游戏是通过文字描述来进行的。游戏过程中，需要玩家进行过多的想象，使得游戏相对比较单调。虽然目前已经有了彩信等特殊服务可以让这类游戏更加人性化，但是其本质依然无法改变。而且，对于文字类游戏来说，其不低的价格门槛依旧是制约其发展的一大瓶颈。
图形类游戏：
图形类游戏更接近我们常说的“电视游戏”，玩家通过动画的形式来发展情节进行游戏。由于游戏采用了更为直观且更为精美的画面直接表现，因此图形类游戏的游戏性和代入感往往较文字类游戏高。因此广受玩家们的欢迎。
图形类游戏主要分为：
a，嵌入式游戏：
嵌入式游戏是一种将游戏程序预先固化在手机的芯片中的游戏。由于这种游戏的所有数据都是预先固化在手机芯片中的，因此这种游戏无法进行任何修改。也就是说，您不能更换其它的游戏，只能玩您的手机中已经存在的游戏，且您也不能将它们删除。
诺基亚早期手机中的“贪吃蛇1.2”就是嵌入式游戏的典型例子。
b，可变安装式游戏：
用户可以通过GPRS，3G网络或者电脑等方式，下载Java ME手机游戏安装到自己的手机里，这是现在比较流行的趋势，使自己的手机拥有更多的游戏应用，百玩不厌。
java是一种程序语言，具体是什么程序语言我们完全没有必要知道。作为游戏一族，我们只需要知道两件事：
第一，您的手机是否支持java，要了解这一点您可以查阅您的手机的说明书，或者直接询问经销商。
第二，您挑选的java游戏是否支持您的手机，要了解这一点，您可以参阅“为什么手机游戏也会有兼容性问题”以及“如何从游戏下载符合您的手机型号的手机游戏”部分。
在这里，有一个误区需要解释，那就是有时候我们说起java游戏，往往第一个想到的可能就是高端的手机配置，事实上这是一个很大的误区。
c，brew游戏 
我们也不用知道brew是什么东西，要使用brew，您只需要了解您的手机是否支持它就可以了。目前，只有cdma的手机才支持brew，但是同时，cdma也支持java，于是为了减小成本，一般的开发商还是愿意选择基于java的游戏进行开发。因此，brew支持的游戏还不是很多。
d，uni-java游戏 
uni-java是中国联通刚刚为其手机准备的一个新的通用开发平台，目前还处于开发阶段，还没有基于uni-java的手机推出。但是在不久的将来，uni-java必将是联通的一把利器。
数字签名
随着国家3g牌照发放的临近，手机游戏市场再度成为业界关注的焦点。上周，业界相关人士表示，中国手机游戏市场经过几年的市场培育，市场开发已渐成熟，3g时代的到来将使中国手机游戏市场规模将大幅度增长，一场手机游戏盛宴有望上演。3g时代的到来，网络带宽的速度将大幅提升，那么手机游戏带给用户的将又是一种全新的体验，大家体验越来越好的时候，这个经济一定会越来越热。因此可以预见3g时代到来的时候，手机游戏一定会成为主流之一。从手机游戏的几年发展不难看出，从简单内置的手机游戏到下载类游戏，再到联网游戏、多人联网游戏，最后发展到跨平台联网游戏，手机游戏产业正不断升级，随着3g时代的到来，对于手机游戏来说，意味着更强的终端表现力、更快的传输速度，全新的体验将使它吸引更多的用户加入进来。
得到一个证书后就可以对Java ME的jad文件进行签名。这里有一些与签名相关的需要注意的一些问题。
⒈想要安装签过名的软件，就必须通过jad来安装。
我们知道Java ME程序生成后会有jad和jar两个文件，一般情况下我们只需要安装jar文件就可以了。例如我会将jar文件通过蓝牙传到手机上，再进行安装。但如果想通过手动安装签过名的文件，就要通过jad来安装，而且要确保jad和jar文件是在相同目录下。我的做法是通过数据线将两个文件拷入手机的内存或存储卡上，然后通过jad来安装，这样安装好的软件就是签过名的软件了。不会再有总是很烦人的询问用户是否允许操作的提示信息。
但就我看过的手机看来，应该是不同的手机有不同的表现。例如索爱的手机关于提示仍然是需要用户自己设置的。诺基亚也是。只是诺基亚的在使用非签名软件时用户无法设置为“总是允许”或“只提示一次”。而签了名的就可以设置了。
⒉编程人员需要注意，像很多功能在未签名前是可以使用的，例如gps，网络连接，文件读写等。
⒊签过名的软件有什么好处。
签名就是告诉我们这个软件是可信的，对用户最直接的感受就是联网或访问手机文件的时候，收发短信，彩信，蓝牙等，但签名后这些功能就部可用了。
这就是jad中MIDlet-Permissions属性的问题。当未签名时对这个属性的要求并不严格，但签名后就一定要注意。必须把所要使用到的权限加入进去，否则这个功能就不能使用了。
常用函数
/**
* 通过计算公式实现反正切、反正弦、反余弦
* Tan（X）=Sin（X）/Cos（x）
* ArcSin（X）=ArcTan（X/Sqrt（1-Sqr（X）））
* ArcCos（X）=ArcTan（Sqrt（1-Sqr（X））/X）
*
* @author Ken_xu
* @version 1.0 Copyright 2008-5-4 下午04:09:04
*/
public class SuperMath {
/**
* 反正切
* radian为正切值，这个函数的值域为－π/2～π/2
*
* @param radian
* 弧度为单位的角度
* @return 该角度所对应的反正切
* @author Ken_xu
*/
public static double actTan（double radian） {
System.out.println（radian）；
double retval = 0d;
if （Math.abs（radian） 《= 1.0d） {
retval = radian / （1.0D + 0.28d * sqr（radian））；
} else {
retval = -radian / （sqr（radian） + 0.28d）;
if （radian 《 -1.0d） {
retval = retval - Math.PI / 2;
} else {
retval = retval + Math.PI / 2;
}
}
return retval;
}
/**
* 反正切
* 正切值为y/x，因此该函数求的是y/x所对应的角，这个函数的值域为－π～π
*
* @param y
* @param x
* @return 该角度所对应的反正切
* @author Ken_xu
*/
优化内存
内存占用主要有两种，即程序和资源。程序类会被编译成class字节码文件随MIDlet的启动加载进内存，而且是一次性全部加入。也就是说MIDlet里类个数越多、单个类程序越长、类内字符串常量及数据越多，编译后的class文件就越大，载入后占用的内存也越多。我经常在MIDlet类的构造函数里用Runtime方法来查看MIDlet启动后整个程序占用内存量。
优化方法：
⒈将MIDlet程序写成两个类来减少内存占用量，但是以牺牲Java的OOP特性为代价的。在程序比较大时这种弊端将尤为显见。而且CoCoMo曾经遇到过单个类过大，载入时间过长而违反百宝箱有关Logo 6秒时间限制的情形。
⒉尽量编写优雅的代码，减少函数数量，在程序发布时去掉try catch，最大限度的减少程序行数，这一般都是在老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。
java虚拟机
我们知道，任何Java程序都是在JVM中被执行的。那么对于J2ME来说，情况又是如何呢？CDC仍然使用与J2SE相同的JVM，对于CLDC，由于设备资源受到限制，Sun专门开发了一个新的名叫KVM（K Virtual Machine）的虚拟机。这是个不同于传统的Java虚拟机： 
● 虚拟机本身仅仅需要40-80KB内存； 
● 只需要20-40KB动态内存（堆）； 
● 能够运行在16位25MHz处理器上。 
当然KVM只是一个由Sun实现的符合CLDC规范的Java虚拟机而已，它并不是唯一的，还存在很多类似的虚拟机，你也完全可以自己实现一个这样的虚拟机，只要它符合CLDC规范就可以。3G梦工场java学校课程内容中就会详细介绍j2me，从开始到结束详细的介绍了j2me如何开发一款手机游戏，j2me[2]涉及的编程内容介绍。