J2ME开发初探

原创 2006年06月14日 19:31:00

摘要:本文是J2ME开发的入门性文章,从零开始介绍了进行J2ME开发首先需要了解的一些东西。阅读本文几乎不需要相关的基础知识。

1.1.        J2ME简介

J2MEJava 2 Platform, Micro Edition的简称。它是Sun Microsystems公司在Java的品脾之下的四种平台之一,其他三种分别是J2SE, J2EEJava CardJ2ME的目标是消费类设备和嵌入式设备市场,包括各种电子产品,比如手机、PDA、传呼机、机顶盒等等。J2ME的开发进程同样由JCPJava Community Process)来负责。

J2ME继承了Java优秀的跨平台兼容性,这是它与其他无线开发技术相比的优势之一。它为创建小型设备上的各种应用程序提供了完整的解决方案。

1.2.        J2ME总体架构介绍

J2ME架构如下所示:

各种ProfileMIDPFoundation profileKJava等)

各种ConfigurationCLDC/CDC

各种Java虚拟机(KVM/CVM

主机操作系统

其中各种Java虚拟机,Configuration以及Profile构成了J2ME程序完整的运行时环境。

Configuration决定了相应的Java虚拟机。比如CDC Configuration决定了CVM。而Profile则是一组位于Configuration之上的API,为开发特定领域的应用提供支持。

此外,还有一些开发和部署各种应用的工具。

1.2.1.    Configuration介绍

划分Configuration的主要依据是目标设备的处理器能力和内存容量,而与其网络连接的类型和速度无关。这样做的理由之一就是,即便各种小型设备在功能和形式等方面大相径庭,但是它们通常使用相似的处理器和数量接近的内存,所以以此为依据,对它们进行横向的分组是比较合理的。

目前J2ME的两种标准Configuration是:

l         CDCConnected Device Configuration

l         CLDCConnected Limited Device Configuration

1.2.1.1.        CDC

    CDC的目标设备为间歇性的连接到网络的设备,比如机顶盒,汽车导航系统等等。相对来说,它要比CLDC的覆盖范围更广一些,其目标的处理能力也更强大一些。CDC包含功能完整的Java虚拟机,与J2SE当前使用的虚拟机类似。

以下列出了部分官方J2ME规范定义的CDC设备资源需求:(请以JCP网站上最新的相应规范为准)

l         具有32位处理器

l         具有2M以上内存供Java使用

l         连接到网络,通常是无线间歇连接,而且具有有限的带宽。

l         用户界面不是必须

l         其他的要求…….

1.2.1.2.        CLDC

    CLDC Configuration的应用更为广泛一些,它的目标设备主要包括手机,PDA,掌上电脑等等。其处理能力比CDC设备要相应的弱一些。

以下列出了部分官方J2ME规范定义的CLDC设备资源需求:(请以JCP网站上最新的相应规范为准)

l         具有160K512K以上内存供Java使用

l         具有有限的电源(通常是用电池来供电)

l         连接到网络,通常是无线间歇连接,而且具有有限的带宽。

l         用户界面不是必须

l         其他的要求…….

 

需要注意的是,区分这两种Configuration的主要依据应该放在处理能力,内存量,是否使用电池等。而不是其网络连接的类型和速度。而且这两种规范之间的界限也越来越模糊了。

1.2.2.    虚拟机介绍

    如前所述,Configuration定义的功能决定了相应的虚拟机。所以目前有两种虚拟机:

l         KVMKilo Virtual Machine),对应于CLDC

l         CVM,对应于CDC

1.2.2.1.        KVM

    KVM专门为资源受限的小型设备所设计。它来源于Sun研究院的“Spotless”工程。KVM是符合JVM规范的虚拟机,除了在为满足某些特殊的需求而背离JVM规范之外。

1.2.2.2.        CVM

    CVM用于处理能力较强的消费类和嵌入式设备,它支持Java 1.3虚拟机的全部功能。

1.2.3.    Profile介绍

Profile定义了应用程序所支持的设备类型,为特定域的应用开发提供支持。J2ME目前已经包括了多种Profile,比如MIDPPDA ProfileKJava, Foundation Profile等等。以下只介绍MIDP

1.2.3.1.        MIDP

    MIDPMobile Information Device Profile,它提供了移动设备使用的API,比如手机。它定义了用户界面,网络以及持久存储等相关的类。运行于MIDP下的应用称为MIDlet。后续的示例程序就是一个MIDletMIDP允许把新的应用程序下载到用户设备上,比如下载一个小游戏到手机上面并运行。

1.3.        搭建简单的开发环境

本文只介绍基于Sun提供的J2ME无线开发工具包的开发活动。不包括与各种IDE的配合使

用比如JbuilderX等等。也不包括其他厂商提供的开发包的介绍,比如Nokia S40系列的开发包。您有兴趣的话,可以参考其他资料自行学习。

1.3.1.    下载JDKJ2ME无线开发工具包(WTK

这些都可以到Sun的官方网站免费得到,安装也很方便。本文基于JDK1.4.2WTK1.0.4。您可以下载更高版本的开发工具。

本文的安装路径为:

C/jdk142以及C/wtk104,您可以根据自己的情况合理更改。

1.3.2.    设置环境变量

Windows 2000XP上面,通常可以这样设置:右击我的电脑—>属性—>高级—>环境变量—>系统变量,然后添加JDKWTK的路径即可,也就是将C/jdk142/bin以及C/wtk104/bin添加到PATH变量的后面即可。

验证以下是否设定正确,可以在命令行输入WTK包含的preverify命令。如果系统提示找不到命令,则说明没有设定好,反之则已经设定好了。

此外,设置如下的环境变量,可以方便在命令行上编译和运行J2ME程序。

变量J2MEWTK_HOME 设定为:C:/wtk104

变量MIDPAPI 设定为: %J2MEWTK_HOME%/lib/midpapi.zip

变量J2MECLASSPATH 设定为:

%J2MEWTK_HOME%/wtklib/kenv.zip;%J2MEWTK_HOME%/wtklib/kevm.jar;%J2MEWTK_HOME%/wtklib/lime.jar

Windows 2000XP上可以参考上诉方法,添加相应的变量即可。

1.4.        一个简单的Midlet示例

从伟大的“K&R”开始,“Hello World”几乎成了入门必修课。呵呵,我们也顺其自然吧。本文先列出代码,并适当的讲解以下,然后讲述如何编译和运行它,然后讲述一些其他的知识。

代码如下:

//HelloWorld.java

 

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

 

public class HelloWorld extends MIDlet {

   

    //MIDlet 的显示

    private Display display;

   

    //用于显示"Hello World"字样

    private TextBox box = null;

   

    //Constructor

    public HelloWorld()

    {

        box = new TextBox("Hello World", "Hello World", 20, 0);

    }

   

    //MIDlet应用程序生命周期管理方法之一,负责激活MIDlet

    public void startApp()

    {

        display = Display.getDisplay(this);

        display.setCurrent(box);

    }

   

    //MIDlet应用程序生命周期管理方法之一,负责暂停MIDlet,本例无需如此

    public void pauseApp()

    {

    }

 

    //MIDlet应用程序生命周期管理方法之一,负责释放资源

    public void destroyApp(boolean unconditional)

    {

        box = null;

    }

}

下面对代码进行分析。

该类继承了javax.microedition.midlet.MIDlet类。该类是J2ME中所有MIDlet的父类。

Display类来自javax.microedition.lcdui.Display。代表了MIDP设备的显示器。可以通过Display类的静态方法getDisplay()获得显示器,并通过静态方法setCurrent()使得HelloWorld MIDlet可以在设备上显示“Hello World”字样。

TextBox是字符串“Hello World”的载体,它在构造函数中被实例化。

startApp()pauseApp()destroyApp(boolean unconditional)是应用程序管理系统(Application Management System)用来管理MIDlet的执行的,称它们为应用程序生命周期管理方法。开发过Applet的读者,可以与Appletstart()stop()destroy()相类比。应用程序的有三种可能的状态:运行状态,暂停状态和销毁状态。这些状态和方法之间的转换关系如下:

l         public void startApp() MIDlet从暂停向运行状态转变时,需要调用这个方法,通常会初始化运行MIDlet的所需的所有对象,并设置当前的显示器。需要注意的是,该方法可以多次被调用,所以对于那些仅需一次初始化的程序,不要放入这个方法里,而是放到MIDlet的构造函数里。

l         public void pauseApp() MIDlet从运行转向暂停时,需要调用这个方法。一般会执行暂停当前运行的所有线程等活动。

l         public void destroyApp(boolean unconditional) :当应用程序不再需要,而要进入销毁状态时,需要调用这个方法。它将释放应用程序的全部资源。既可以从暂停状态转到销毁状态,也可以从运行状态转到销毁状态。

1.4.1.    编译

    为了方便起见,将本程序源文件置于C/. 。先在这个目录下建立一个tmpclassess目录,以备后用。

       使用命令行,输入以下命令编译程序:

javac -d tmpclasses -bootclasspath %MIDPAPI% -classpath %J2MECLASSPATH% HelloWorld.java

       该命令编译上诉程序,并在tmpclasses目录下创建HelloWorld.class文件。-bootclasspath -classpath的作用是设置正确的启动路径和类路径,从而只使用J2ME的类。

1.4.2.    预验证

J2SE环境下,只需类文件即可运行Java程序,但是在J2ME环境下,还需要有预验证这一

因为出于安全的考虑,任何进入运行时的class文件,都要经过Byte Code验证器(Byte Code Verifier)的验证,以保证程序代码安全有效。比如:不会溢出堆栈,不包含恶意代码,经过了合理的初始化等等。只有通过了审核的代码,才会被JVM执行。这对于普通应用程序的执行环境来说,是可以接受的硬件要求。但是对于像CLDC这样的设备来说,它们的资源太受限了。如果期望在运行时执行同J2SE VM一样的验证程序,是不现实的。因此,我们需要把大部分的验证工作交给开发MIDlet程序的机器来完成,而MIDlet的目标设备只需执行很少的验证工作即可。这就导致了预验证步骤的出现。

       在预验证的过程中,会在class文件中加入一些特殊的符号,用于简化目标设备的验证工作。

       预验证之前,可以创建一个classes目录,用于保存验证通过的class文件。具体的命令如下:

preverify -classpath %MIDPAPI%;tmpclass -d classes tmpclasses

1.4.3.    创建jar文件

首先进入classes目录,然后执行:

jar cvf HelloWorld.jar HelloWorld.class

       这会把程序包含的所有类和资源压缩到JAR文件,并为其创建打包清单。

1.4.4.    创建jad文件

JADJava Application Descriptor)文件,用于描述该JAR文件包括的程序的一些属性,比如

大小等等。在实际部署时,该文件会先被下载到目标设备上,由目标设备的应用程序管理系统(Application Management System)来处理并决定是否下载真正的JAR文件。

    本例的JAD文件如下,HelloWorld.jad

MIDlet-1: Hello,,HelloWorld

MIDlet-Name: HelloWorld

MIDlet-Version: 1.0

MIDlet-Verdor: ORA

MIDlet-Jar-URL: HelloWorld.jar

MIDlet-Jar-Size: 860

这个文件内容很清晰,包括名称,版本,JAR文件地址和大小等信息。关于JAD文件的具体语法,本文不作具体的介绍,您可以参考相关资源。

1.4.5.    在仿真器中运行

    首先,需要把JADJAR文件置于同一个目录下,比如classes

    然后运行如下命令即可:

emulator -Xdescriptor:HelloWorld.jad

 

1.5.        开发技巧,性能注意事项

使用局部变量。使用局部变量会比使用类成员要快。

使用StringBuffer而不是字符串串联。字符串串联会引起大量对象的创建和回收,降低了性能。

使用尽量少的方法调用。由于JVM使用堆栈来加载和存储方法调用,所以应尽量少用方法调用,降低开销。

尽量重用对象。对象的创建和回收都会带来开销,所以应该精心设计,尽量重用现有的对象。比如在方法内传递对象的引用,然后修改对象的值。

使用线程,避免同步。对于运行时间较长的操作,需要一个独立的线程来执行,避免同步可提高性能。

PNG图片进行优化处理。

使用“混淆器”。除了可以防止class文件被反编译之外,也可以在一定程度上减少class文件的尺寸。

1.6.        总结

正如本文的摘要所述,这是一篇入门的文章。为此,文章舍弃了许多内容。笔者认为那些内容更适合出现在其他主题的文章中。呵呵,希望这篇文章能给您带来一些收获,帮助您顺利的搭上J2ME开发的快车。

欢迎指正,欢迎讨论!

欢迎转载,请注明出处!保留相关权力。

IOS、安卓IM语音聊天开发初探部分心得——网络基础篇

今儿是个还债的日子,没错,承诺了许久的网络传输篇虽然没有千呼万唤,不过我还是厚着脸皮始出来,继上两篇文章总结了一下开发IM语音功能时所遇到的音频问题,而今天就让我们来看看这个让我们看似近在眼前,确始终...
  • ALDRIDGE1
  • ALDRIDGE1
  • 2014年01月12日 00:17
  • 2572

【代码】如何快速将J2me游戏移植到Android上

前言 小白:“老大,你让做的三个J2me游戏搞定了,请看DEMO。” 老大:“恩,不错,小白,你知道Android这个平台吧?” 小白:“恩,听过。听说和J2ME有很多共同点。” 老大:“(一阵奸...
  • u011884154
  • u011884154
  • 2013年09月11日 12:13
  • 1216

JDK、J2EE、J2SE、J2ME的区别

你对JDK、J2EE、J2SE、J2ME概念是否了解,这里和大家分享一下JDK、J2EE、J2SE、J2ME的概念以及他们的关系区别,相信本文介绍一定会让你有所收获。JDK,J2EE,J2SE,J2M...
  • wangyunzhong123
  • wangyunzhong123
  • 2016年06月02日 13:40
  • 2704

初探J2ME之一

最近在看一个关于J2ME的英语游戏项目,由于没有什么经验,所以做一些学习记录。 1.认识JAD文件。  首先,介绍什么是JAD文件。JAD是Java 应用程序描述符。JAD文件是软件配置的信息文件...
  • stone_0088
  • stone_0088
  • 2012年03月18日 14:18
  • 140

J2ME开发手机游戏物理模型之抛物线

原文地址http://www.hbjjrb.com/Jishu/jsp/200704/7581.html     物体做抛物线运动是游戏中基本运动物理模型之一!...
  • luonan0706
  • luonan0706
  • 2012年12月04日 22:09
  • 554

J2ME开发机型Bug汇总

对于J2ME开发者来说,模拟器给我们带来了很多方便,比如可以在模拟器中调试程序以及很方便的察看程序的效果,但是模拟器也给我们带来了一些问题,比如模拟器实现的bug等等,所以进行真机测试是必须的。1、为...
  • zengzhongxiang
  • zengzhongxiang
  • 2011年07月22日 10:28
  • 298

J2ME 拼图游戏 快速开发 全过程 (六)——图片设置界面设计

代码: package cn.edu.xtu.tilepuzzle.ui; import java.io.IOException; import java.util.Vector; ...
  • love254443233
  • love254443233
  • 2012年04月14日 13:38
  • 942

J2ME 拼图游戏 快速开发 全过程 (二)——游戏开始界面设计

源码: /*  * Created on 2004-6-20  *  * TODO To change the template for this generated file go to ...
  • love254443233
  • love254443233
  • 2012年04月14日 13:24
  • 1148

J2ME开发环境配置(MyEclipse插件+WTK+jdk)

Myeclipse J2ME开发之环境配置的前言随着移动设备的普及和应用,在小型存储设备方面的研发进入了一个全新的时期,比如数字电视,PDA,移动存储通信设备等。而各方面的技术也进入了一个飞速发展的时...
  • u010229420
  • u010229420
  • 2013年09月25日 19:51
  • 758

J2ME游戏开发的高级优化技巧

为什么要优化?   游戏能够被划分为两种较广泛的类型:实时型和按键驱动型。按键驱动类型的游戏一般在屏幕上显示游戏目前所处的状态,并且等待玩家输入某些按键来驱动游戏继续运行。棋牌类游戏,大部分的解谜类...
  • kuokuo_xiaxia
  • kuokuo_xiaxia
  • 2014年04月07日 11:23
  • 267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:J2ME开发初探
举报原因:
原因补充:

(最多只允许输入30个字)