一、安装开发工具
本文是介绍如何编写在Siemens 6688i上运行的Java程序,本文从一个工程tutorial开始,以实例讲述了编写方法。由于本人也是个初学者,还没有仔细看过Java的书,只是略有点C++基础,对Java的术语都不知道,有错误的地方还请大家指正,并且本文会不断更正、完善。
阅读本文前,请确认您是否具有一定的Java基础或C/C++基础,假如不是,请首先学习Java的基本语法。
本文的所有例子都是在Borland JBuilder 6 personal + Borland MobileSet 2.0 + Siemens Mobility Toolkit(SMTK)6688i v1.0 beta 7上运行通过的,另外还需要打包工具Jar。关于这四个工具的下载地点请去我的论坛查找。
开发工具的安装与设置
首先安装Borland JBuilder 6 personal,安装完成后初次运行需要注册,选择Have License Key,点Next>,选择Paste license key text,然后把下面这堆注册码复制进去,在确认一次协议后就OK了。
注册码如下:
%26%FFj%F4%00%00%023%DF%DD%23f
%BD%83%DF3%CD%02%1D%E0%D7%A1%1
4%C1%7E%28%A8%EA%C0x%DEw%3A%C3
%B2%ABX%92%02%14%81%8D%F4%0B%9
C%27y%90%DF%FE%7F%DF%23%7E%A7%
F2%E09%A1%00%7B%81%AA%9C%1A%B0
_%28%CB%E8%EBA%A1fN%F9%99%D9V%
87%01f%D8%8E%FA%3C%FC%1D%3E%A4
%BE%B5%0A%E7%0BG%E3%AE%AF%5D%A
A%5C%17%FD%EB%CAv%B2%09%16%E3%
CD%E0%0B%F1e%3E%CA%FA%CB%09%D5
7%3C%9C%F2%FEV%CF%0EV%8D%BC%CC
y%85My%F6%CB%C8D%F1%5E%29%DB%C
0%8A%17%E2K%22%F5%A9%80o%B1%20
%0C%D8%FD%B5%7C%ED%0D%7E%85%8A
%F0t%9A%0D%17%F1%96%95%0B%E2%1
D%1E%8E%9C%ECq%86I%20%CF%E0%F8
%7F%D2%02%7E%AC%90%80-%D5MM%F3
%E7%86%1D%B7%5CW%A0%E8%F7%3C%8
4%1F%0A%BF%A0%E2J%E0%16%16%D7%
93%E82%AAv%3B%89%B0%DA%11%AEmN
%FD%A1%B2I%B2%08%13%E5%AC%CF%1
6%BCt%1C%AA%A4%FF%7C%F8%24%05%
BB%D7%CD%5E%F1%7Ec%AC%EC%8B1%B
DdC%91%D7%DC%29%A7ei%DE%A3%F4%
2B%DD.O%ED%F3%8BT%E6e%24%D3%FC
%FD%60%D7c%3D%C9%CA%AB%0D%FBf6
%95%D8%D1%5B%C8T%19%ED%8A%B1%1
8%81%02U%8A%8C%92%20%95vi%B5%8
2%E7h%D1y%1A%C1%BC%88%26%FD_%0
5%B3%A5%DB%0B%8D%157%F9%FB%8CP
%FA%0Da%C8%99%96G%B5%02%3F%9C%
C9%9A%08%97oQ%A5%BC%92t%81.%05
%F7%A7%FF%18%BE_%22%A6%8D%EAK%
D6%06%3D%A5%D7%DCk%84o6%E4%E0%
C5D%FA%27%7D%B8%C0%AB%3E%83uV%
B8%F6%D2%2B%B1Hn%A6%F0%A70%FAF
%7E%AA%C6%DF%27%9D%0C%05%A0%97
%9E%3E%8BaX%D1%BB%AC%1B%82%7B%
25%CE%8D%A6n%FEIY%95%A6%F4%3E%
DDn-%EB%B5%869%CD%5Bo%DA%EE%A8
l%EDV%20%CD%E9%E1j%8F%5B%0B%82
%D4%B3t%A1%1EK%95%D7%AD%5B%FF%
18g%A1%F6%9B.%B6%7B3%E1%96%CF*
%F2%05v%A6%E1%8F%3C%A1%05%29%D
F%C4%D4p%B1o8%D3%D7%B4%12%97%0
5%0E%B2%D7%BCW%F0%17d%CD%90%E0
I%A3%00D%90%BD%C4L%B1ii%96%E1%
BD%3F%AB%28z%F5%D2%92%25%FF6H%
DB%E9%C9%1A%99%27
接下来安装Borland MobileSet 2.0,安装完成后初次运行JBuilder6也需要注册,选择Have License Key,点Next>,选择Paste license key text,然后把下面这堆注册码复制进去,在确认一次协议后就OK了。
注册码如下:
R%1B%ABN%00%00%02L%DF%DD%23f%B
D%83%DF3%CD%02%1D%E0%D7%A1%14%
C1%7E%28%A8%EA%C0x%DEw%3A%C3%B
2%ABX%92%02%14%81%8D%F4%0B%9C%
27y%90%DF%FE%7F%DF%23%7E%A7%F2
%E09%A1%00%7B%81%AA%9C%1A%B0_%
28%CB%E8%EBA%A1fN%F9%99%D9V%87
%01f%D8%8E%FA%3C%FC%1D%3E%A4%B
E%B5%0A%E7%0BG%E3%AE%AF%5D%AA%
5C%17%FD%EB%CAv%C1%1E%7D%90%C0
%99o%8F%0B1%C7%EA%AA%0B%C8F_%8
3%9E%EC*%BCp8%82%B1%DC%18%87P%
08%95%D4%A4V%8D-W%B5%CF%87%07%
83I%3F%84%CA%9F%03%A3%5C%7F%A6
%93%BA%1D%F3l%15%96%8A%80a%8A%
11%1D%9C%EB%EEc%E4u%04%FA%93%F
Cw%FC%21H%A2%F3%F8z%AC%11%7B%D
7%FD%96S%C36%25%9B%8A%95%1D%B2
%22D%A5%93%9A*%FA%09q%D7%CB%86
Y%E3%1Ah%C7%9C%9A%5C%B5%0B%27%
F8%D2%BB%7C%BDnB%83%B1%BD%3B%D
C%17n%F9%DD%ADw%D1g%1F%A6%DA%E
Fp%A4m%06%E2%F1%B2W%E8T%0D%B2%
B2%AC%29%D8%1F%7B%92%AE%9A%14%
C02l%DA%F6%A5W%BD0%5C%8B%8A%F0
v%87%15b%F1%87%81k%94%02t%80%D
5%E1%0C%C8kl%BA%A9%FE.%EB8L%80
%AD%8CI%8FMD%D0%C1%E5r%D7%27%7
B%AA%CA%A3B%F7M%1E%D4%BD%E7%2C
%8A0L%B2%AE%81%7E%88%7Bh%F1%8D
%AE%02%E8%3B%2C%89%82%89%5D%8E
II%BD%C2%EE%10%8D%3Do%E3%E8%FC
N%CE%17u%BA%9D%CAO%BFWf%F2%E0%
E5%7E%FC%02%5E%82%92%CB%13%ED8
D%C6%D2%9Bq%E2-k%98%C4%DAe%A2%
1CC%C1%A3%AEy%99%13%14%E5%8A%F
64%90%10U%8F%83%BA%25%C93%00%9
6%E2%C0g%9E%20B%FF%D6%F9%01%BE
%28c%EE%FC%D9e%81H%14%90%CE%D9
9%C3y%1A%EB%A1%91%1F%89%28y%90
%9B%AEz%9C%1A%05%9E%E5%C6B%948
7%FF%A6%E0%7E%87LP%F5%D3%A6%3B
%B1%0B6%DD%C5%A5%14%FBbF%96%EA
%9BG%84%19v%BA%F6%FF%5C%F7e%5B
%D1%D0%A3%1B%FBb%5C%F7%87%D7-%
F6%0B%7D%DC%87%D52%DAD%1B%FB%8
7%CBz%C1%2CI%C2%B8%E5%17%97T%1
1%86%AF%DCS%EF6%3D%C4%CC%F2%1B
%9E%25%15%F2%CB%D2%05%AAi%5E%D
2%C1%BA%05%865%7C%AD%91%C2%29%
A2q%3C%B5%F4%ADs%C3ys%D4%F9%F2
最后安装Siemens Mobility Toolkit(SMTK)6688i 1.0 beta8 或 SMTK 3118 1.0 beta8,安装过程中会自动识别JDK的路径为JBuilder6安装路径下的jdk1.3.1。
全部安装完成后还需要配置一下JBuilder6。打开JBuilder6,然后点菜单Tools->Configure JDKs,在JDK home path栏点Change,选择6688i SMTK安装的路径,要选到6688i_1b8或3118_1b8为止,确定后上面的Name栏会自动变成Siemens,然后点OK搞定。
二、第一个工程
新建一个工程
在Jbuilder6中先新建一个工程:点菜单File -> New Project,在对话框中输入工程名、路径等内容。请在这里输入Name:tutorial;Directory:D:mydocjavautorial(或你自己选择的路径),然后直接点Finish就可以了。
Java是基于类的,每个公共类都必须新建一个文件。
点菜单File -> New…,在对话框中双击Class,在Class name栏输入类名称TutorialMain,至于上面的Package用默认的就可以,下面的Base Class是定义基类,可以以后改。点OK就可以了。
用同样的方法建立类TutorialForm和TutorialCanvas。
这三个文件的内容分别是:
TutorialMain
package tutorial;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class TutorialMain extends MIDlet
{
protected static TutorialForm pStart;
protected static Display display;
public static void main(String args [])
{
TutorialMain app = new TutorialMain();
app.startApp();
}
public TutorialMain()
{
pStart = new TutorialForm();
}
protected void pauseApp()
{
}
protected void startApp()
{
display = Display.getDisplay(this);
pStart.activate(display, this);
}
public void destroyApp(boolean param)
{
display.setCurrent(null);
notifyDestroyed();
}
}
TutorialForm
package tutorial;
import javax.microedition.lcdui.*;
public class TutorialForm extends Form implements CommandListener
{
protected static final Command[] COMMANDS =
{
new Command("开始", Command.OK, 0),
new Command("退出", Command.STOP, 1),
};
protected static Display display;
protected static TutorialCanvas pGame = new TutorialCanvas();
protected static TutorialMain winMain;
public TutorialForm()
{
super("Java教程");
append("版本:0.1.0
网址:
hzfeng.yeah.net");
for (int i = 0; i < COMMANDS.length; i++)
addCommand(COMMANDS[i]);
}
public void activate(Display disp, TutorialMain tmain)
{
display = disp;
winMain = tmain;
display.setCurrent(this);
setCommandListener(this);
}
public void commandAction(Command cmd, Displayable obj)
{
if (cmd == COMMANDS[0])
{
pGame.activate(display, winMain);
}
else
winMain.destroyApp(true);
}
}
TutorialCanvas
package tutorial;
import javax.microedition.lcdui.*;
public class TutorialCanvas extends Canvas implements CommandListener
{
protected static final Command[] COMMANDS =
{
new Command("继续", Command.OK, 0),
new Command("退出", Command.STOP, 1),
};
protected static Display display;
protected static TutorialMain winMain;
protected Graphics g;
public TutorialCanvas()
{
for (int i = 0; i < COMMANDS.length; i++)
addCommand(COMMANDS[i]);
}
protected void paint(Graphics parag)
{
g = parag;
g.drawString("你好", 0, 0, Graphics.TOPGraphics.LEFT);
}
public void activate(Display disp, TutorialMain tmain)
{
display = disp;
winMain = tmain;
display.setCurrent(this);
setCommandListener(this);
}
public void commandAction(Command cmd, Displayable obj)
{
if (cmd == COMMANDS[1])
winMain.destroyApp(true);
}
}
这里先不对这些代码作解释,先演示一下怎样对工程进行编译和运行。
编译运行
点菜单Run -> Run Project,第一次运行会弹出对话框询问要执行的主类(Main Class),也就是从这个类开始执行,切换到MIDlet子项,点“…”浏览,展开tutorial,选中下面的TutorialMain,然后OK。
JBuilder会自动调用6688i的仿真程序对程序进行仿真。
每次运行前都会自动编译,假如有错误,会有出错显示。
打包执行
编译好的文件都放在工程目录下的classes里,里面有一个以Package名称命名的子目录,打包的时候要包括这个子目录。
由于打包程序Jar是以命令行方式运行的,所以通常做个bat文件打包会比较方便。可以先将jar.exe复制到classes目录里,然后在bat文件中写jar cf tutorial.jar tutorial,执行以下就搞定了。
下载到MMC卡上的时候,现在javajamgame下建立一个tutorial目录,然后将tutorial.jar复制到该目录下,另外还要将工程目录下jad目录中的TutorialMain.jad也复制到这个目录中。
现在可以执行一下试试看了。
示例说明
TutorialMain是起始类,由MIDlet继续而来,其中的public static void main(String args [])就像C语言里的main函数一样,是程序第一个执行的函数,这是52版开始要求的,52版以前可以不需要此函数。startApp里是开始运行程序所作的一些事,Display.getDisplay()是获取屏幕显示的对象,pStart.activate()见TutorialForm里的定义,其他的就没什么可说的了,依样画葫芦就可以了。
TutorialForm是由Form类继续而来,Form是一个窗体,有标题,可以显示文字也可以列出选项、设置按钮。implements CommandListener表示这个类还用到了CommandListener这个组件,这是一个监测按钮动作的组件。
super("Java教程")是调用Form的构造函数,里面的字符串就是窗口的标题。append()是在窗口上插入要现实的内容,不仅可以插入文字还可以插入图片等。for (int i = 0; i < COMMANDS.length; i++) addCommand(COMMANDS[i]); 是把上面定义的按钮数组Command[]添加到窗口上。
commandAction是按钮按下的响应函数,通过参数cmd可以判定出哪个按钮被按下了,从而可以采取相应的措施。
activate函数是自定义用来启用TutorialForm类的。包括display.setCurrent(this)将屏幕输出联系到自己身上,setCommandListener(this)开始对按钮动作进行监测。而winMain变量的设置是为了调用TutorialMain的destroyApp函数以便退出程序。
TutorialCanvas是由Canvas类继续而来,同时也需要监测按钮动作。Canvas是一个画板,可以在上面画图、画字符串等等。
paint函数是当Canvas类显示时调用的绘图函数,g.drawString("你好", 0, 0, Graphics.TOPGraphics.LEFT)是以坐标(0,0)作为左上角画了两个字“你好”。其他的函数与TutorialForm类似。
三、几个常用类
常用类简介
MIDlet类
老实说我对这个类的理解也不深刻,也就是照着其他的程序依样画葫芦,我认为这是一个起始类,程序执行总是从这个类开始。必须要有的事件函数是startApp、pauseApp、destroyApp,顾名思义,就是起始、暂停、终止的时候起作用。
Form类
Form是一个窗体,有标题,可以显示文字也可以列出选项、设置按钮。
Canvas类
Canvas是一个画板,可以在上面画图、画字符串等等。必须要有的事件函数是paint,在显示的时候调用。
Graphics类
Graphics是一个画图的类,有画框、画线、画块、画圆、画字符串等功能函数。