摩托罗拉a6288、388型手机的登场,伴随着一个亮点:自身带有kjava虚拟机(kvm),能够通过多种方式下载且能够运行用户用kjava编写的符合midp1.0规范的应用程序。后来,又有多款手机支持kjava。实际上,kjava不仅能够为a6288等手机编写应用程序,而且还可以为其它一些移动信息设备编写应用程序。这类嵌入式程序和一般的java程序相比,有它的特殊之处,本文将对kjava及其应用进行介绍。
1.kjava简介
java语言最初是为嵌入式系统设计的一项产品,在java 2中为了区分各种不同的应用,又细分成了java 2 enterprise edition(j2ee)、java 2 standard edition(j2se)和java 2 micro edition(j2me)三种版本,其中j2me又称作kjava。
在j2se中,它定义了java规范的核心类函数库(即java.*)和扩展类函数库(即javax.*),它主要定位在客户端的应用程序。j2ee主要定位于服务器端的应用程序,它除了支持j2se所定义的核心类函数库之外,还增加了一些扩展函数类库,如支持serverlet/jsp的javax.servlet.*等。j2me只支持j2se所定义的核心函数类库的一部分,此外,在j2me中还增加了一些支持嵌入式系统的扩展类函数库,如javax.microedition.*等。
同样是嵌入式设备,它们在运算能力、电力供应等方面还是有很大的差别。connected limited device configuration(cldc)规范描述的就是那些运算能力有限、电力供应有限的嵌入式设备,如手机等;而connected device configuration(cdc)规范则描述的是像电视机顶盒这样运算能力较强、电力供应充足的系统。j2me分别支持这两种不同的配置。在同一种配置下,j2me又通过profile来定义与特定嵌入式设备相关的扩展类函数库。
在传统的java环境中,为了防止程序在传送途中被篡改以及其它一些安全上的考虑,当程序被类别载入器载入后,紧接着要进行byte code审核,审核通过以后才允许java虚拟机执行它。这一操作在pc机上执行从速度上来看没有什么问题,但是在cldc所描述的这类系统中,要想作完全相同的处理,从处理能力和速度上来看就显得有些力不从心了。为了解决这个问题,程序设计人员需要在程序设计结束之后额外再多做一件事:预先审核。通过预先审核,会在最终的类文件中加入一些特殊的符号,当该程序下载到目标平台上去执行时,可以以较快的速度完成审核操作。
2. motorola sdk
下面以摩托罗拉a6288型手机为例来具体讲解kjava的程序设计。在摩托罗拉a6288中使用了两颗cpu,一颗是dragon ball vz 33mhz,用于个人数字处理,另外一颗用于通讯的处理。系统为用户预留了约1m的内存空间,支持符合midp 1.0规范的kjava应用程序。我们可以到摩托罗拉的官方网站去下载开发工具:codewarrior(试用版),下面的内容就是基于这一开发工具。
在codewarrior中,它包含了摩托罗拉的sdk,它实现了cldc和midp 1.0。它所实现的cldc类库有java.io.*、java.lang.*、java.util.*和javax.microedition.io.*,实现的midp类库有javax.microedition.lcdui.*、javax.microedition.rms和javax.micromedition.midlet。
我们在pc环境下编写的嵌入在浏览器中的java程序叫做applet,编写的程序必须要从applet类扩展自己的类。而为手机这类移动信息设备编写的kjava程序叫做midlet,程序必须要从midlet类扩展自己的类。一个midlet程序具备如下的典型结构:
public class helloword extends midlet
{
helloword()
{……}
public void startapp()
{……}
public void pauseapp()
{……}
public void destroyapp(boolean unconditional)
{……}
}
当程序被启动时,startapp()被系统调用。(当程序刚开始运行时有启动过程,程序被暂停后也可以被再次启动)。当程序被暂时停止运行时,pauseapp()被调用。当程序执行结束时destroyapp()被调用。我们可以根据实际情况在各函数中进行相应的处理。
在摩托罗拉sdk中没有awt或者swing,因为它们的实现会耗费太多的资源,摩托罗拉sdk只是在javax.microedition.lcdui中实现了基于lcd的一些比较简单的设计用户界面的功能。sdk中定义了各种displable类(如form),程序中当前显示的画面必须是某个displable的实例,在该实例中可以再放置按钮、文本编辑框、单选框等ui。
3. 举例
下面是用kjava编写的一个可以在a6288型手机上运行的简单的例子。具体程序如下:
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class helloworld extends midlet implements commandlistener
{
private maincanvas mycanvas;
private display mydisplay;
private command c1,c2,c3;
helloworld()
{
mycanvas=new maincanvas();
mycanvas.addcommand(c1=new command("first",command.screen,1));
mycanvas.addcommand(c2=new command("second",command.screen,1));
mycanvas.addcommand(c3=new command("third",command.screen,1));
mycanvas.setcommandlistener(this);
mydisplay = display.getdisplay(this);
mydisplay = display.getdisplay(this);
}
public void startapp() throws midletstatechangeexception
{ mycanvas.setup("first");
mydisplay.setcurrent(mycanvas);
}
public void pauseapp() { }
public void destroyapp(boolean unconditional) { }
public void commandaction(command c,displayable d)
{ mycanvas.setup(c.getlabel()); }
class maincanvas extends canvas
{ string ts;
maincanvas()
{ super();
ts=new string("first");
}
public void setup(string s)
{ ts=new string(s); }
public void paint(graphics g)
{ g.setcolor(0xffffff);
g.fillrect(0, 0, getwidth(), getheight());
g.setcolor(0);
g.drawstring("current is the "+ts,getwidth()/2,60,
graphics.hcenter | graphics.top);
}
}
}
程序运行后,可以根据用户选择的不同菜单项显示不同的内容。
闽公网安备 35060202000074号