大象正在森林里准备抽大麻啊!突然过来一只兔子。
兔子说:大象啊大象生活多美好啊。森林的空气多好啊,干吗抽哪个害人的玩意儿啊。跟这我一起在森林里奔跑吧。
大象想:兔子说的有道理,于是扔了手里的大麻和兔子奔跑了起来!
他们跑着跑着,看见老虎准备吸食古柯碱(也是一种毒品)
于是兔子又说:老虎啊老虎生活多美好啊。森林的空气多好啊,干吗抽哪个害人的玩意儿啊。跟这我一起在森林里奔跑吧。
大象,老虎跟着兔子在森林里跑了起来他们跑着跑着,看见狮子正准备注射吗啡。
于是兔子又说:狮子啊狮子生活多美好啊。森林的空气多好啊,干吗抽哪个害人的玩意儿啊。跟这我一起在森林里奔跑吧
狮子想了想放下手里的毒品,走到了兔子面前。二话没说给了兔子几拳,打的兔子眼冒金星,倒在了地上。狮子又拿起毒品可是注射。
大象和老虎就纳闷啊!!!问狮子,人家兔子是为你好啊,你可以不听兔子的话。可是你干吗打人家兔子啊。
狮子轻蔑的一笑说:你们俩个傻B 这王八蛋每次吃完摇头丸都带着我在森林里跟傻子一样瞎跑!!!!!!!!!!!!!!!!!!!!
—————————————————-
朋友的女儿考入北京一所大学。朋友自然非常高兴,摆了一桌宴席。请了熟识的人,席间
,我们少不了说些祝贺的话。然后,我问他:“现在大学生谈恋爱比较普遍,你有没有和
你女儿谈过这个问题?”朋友点点头.说:“谈过了。我已经表明我的态度了,不鼓励。也不
阻止。”那么我又问:“那你打算一个月给你女儿多少的生活费?”“还没有最后决定。我
打算送她到学校,看她同学的家里都给多少钱,我取平均数。”他说。
几天后,朋友送女儿去北京。到学校一问,和她同宿舍的三位同学当中,一位是贫困生,家
里面每月只给200元。一位父亲是老板,每月生活费千元以上。还有一位叫佼佼的,父母也
是工薪家庭,每月的家里给600元。班里大多同学家里面也都给这些。亲戚就把女儿的生活
费锁定在这个数字上。
一个月后,父亲去银行往女儿的的一卡通里面存钱,先打电话过去问: “600元够不够。”
女儿回答:“够了。”父亲放心了,嘱咐说:“想买什么就买什么,别亏了自己。也别和
人家老板的女儿比,你只要和绞绞保持同等生活质量就行了。”
女儿听了,半天不作声。父亲觉得奇怪,就问:“怎么了?”女儿犹豫了一下,说:“爸
爸,我不知道应该说或是不说。”父亲:“有什么事情快说,爸爸帮你分析,提建议。”
女儿说:“佼佼和我一样,每月家里面也是给600元。但是她的生活质量比我高。她每天都
有零食吃,每周去一次麦当劳,有时候还能去必胜客。”
父亲一算,这样的话,600元根本都不够花。“她是不是去打工了,你不要去耽误学习。”
父亲急忙说。“没有,她没有去打工,是在谈恋爱。有一次她约会回来对我说。其实她不
喜欢那个男生,只是喜欢他替她埋单而已,我们班上也有几个女生也是一样的。
她们还嘲笑我,说我傻。可惜了这张脸,如果她们有像我这样漂亮能吸引男生的脸。根本
不用向家里要钱。她们会找到愿为她们付费的长期饭票……”
父亲愕然。放下电话,朋友一分钟都没耽误,给女儿的卡上存了700元钱,又回家发了一封
邮件。
他在邮件上写着:亲爱的女儿,从这个月起,我每月给你700元的生活费。多出来的100元
,你可以买零食,去麦当劳,必胜客……记住,任何时候,都要用自己的钱埋单。这才是
有质量的生活。
还有,如果你喜欢某个男生,开始谈恋爱,请一定要告诉我。我会每月再给你增加100元,
作为恋爱经费。请你一定要记住,每次约会,不要忘了带上你的钱包。你要学会并习惯为
自己所爱的人埋单,这样你才有资格得到一份有质量的爱情。
又学会一些东西:
不要在D1-221的地板上睡觉,虽然那会带来关心与帮助,但也同时带来头疼与针眼……
我现在已经不知道该怎么办了!
烦!
忙!
怎么办?
??!?!????????????????
??????????????????????????
????????????????????????????
??????????????????????????????
????????????????????????????????
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SHIT!
J2ME编程是Java在智能家电领域的应用,主要包含以下技术:
1、 高级用户界面
高级用户界面是指J2ME编程中用到的Form(窗体)、TextBox(文本框)、List(列表框)和Alert(提示信息框)等的使用,以及其中的一些控件的使用,当然也包括相应的事件处理。应用在一般的如登陆窗体、关于窗体和提示等。
2、 低级用户界面
低级用户界面指Canvas类和Graphics类等的使用,以及相应的事件处理,应用与游戏编程以及特殊界面的绘制等。
3、 记录存储系统
记录存储系统是手机中支持的用于数据永久保存的技术。因为手机中没有数据文件的概念,所以一般需要保存的数据只能以记录的形式保存。
4、 声音处理系统
MIDP1.0不支持声音处理,但是很多手机厂商如Nokia、Siemens等都支持,所以播放声音也是一项需要掌握的技术。该技术使用的API多和手机厂商相关。但是MIDP2.0就提供了通用的支持。
5、 网络编程
网络编程指在手机中通过GPRS或者CDMA网络以HTTP协议或者SOCKET的形式连接网络。现在的手机支持HTTP网络编程的占大多数,支持SOCKET的相对很少。所以网络编程暂时也就是使用HTTP协议进行编程。
6、 多线程
多线程是J2ME应用中比较核心的技术之一,因为进行网络编程和低级用户界面编程是为了响应迅速,都需要处理成多线程。所以也必须熟练掌握。
7、 短信息编程
很多手机都提供了用于发送短信息的API,如NOKIA、SIEMENS、SAMSUNG等,所以在J2ME中发送短信息也是一个比较常用的技术。
8、 其他
当然根据厂商的不同还提供了其他的一些技术,如Siemens的API中支持文件,Nokia的API支持读取系统通讯录等等。
一、J2ME中需要的Java基础知识
现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明。
J2ME中使用到的Java基础知识:
1、Java语法基础:包括基本数据类型、关键字、运算符等等
2、面向对象的思想:类和对象的概念,继承和多态等等。
3、异常处理
4、多线程
J2ME中没有用到的Java基础知识:
1、JDK中javac和java命令的使用
2、Java基础中的很多类在J2ME中没有,或者类中的方法做了大量的精简。所以建议在J2ME中熟悉类库。
3、Applet、AWT、Swing这些知识在J2ME中根本使用不到。
简单说这么多,希望学J2ME的朋友们能少走一些弯路,不足之处希望大家积极指正和补充。
二、J2ME中暂时无法完成的功能
列一些J2ME中暂时无法完成的功能,希望大家能积极补充:
1、在手机中不更改代码实现移植,主要指游戏。
2、动态修改按钮文字。
3、在Canvas上接受中文输入。
4、操作本地资源、例如地址本、已收短信息等。
5、制作破坏性的手机病毒。
6、其他等待大家来补充。
三、J2ME的跨平台性
J2ME技术源于Java,所以也具有JVM的优势,可以在支持Java的平台上进行移植,但是现在的J2ME技术在跨平台上却做的很糟糕,我们来简单看一下原因:
1、手机的屏幕尺寸不一:
这个主要在界面制作上。如果你使用的是高级用户界面,比如你做的是应用开发或者用户登陆、用户注册这样的通用功能时,一般没有什么问题。
如果你使用的是低级用户界面,比如你做的是游戏,那么你就需要考虑这个问题了。
2、厂商的扩展API不统一:
例如Nokia的扩展API类库UI系列,在别的手机上或者没有实现,或者包名不同等等。
3、手机平台上实现的bug:
例如Nokia的7650在实现双缓冲上有bug,那么在这种机型上运行的软件就不能使用双缓冲。其他NOKIA上的一些bug,可以参看:http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx
4、手机性能问题。
不同手机的可用内存、最大jar文件都有要求,例如Nokia S40的大部分手机支持的最大jar文件为64K,最大可用内容为210K。
所以现在的手机软件,特别是游戏都提供支持的机型列表,也才有了手机游戏移植人员的存在。
四、学习J2ME可以从事的工作种类
现在J2ME技术可以说相当的火暴,这里介绍一些学好了J2ME之后可以从事的工作的种类:
1、J2ME游戏开发人员
根据游戏策划或者文档要求,在某种特定的机型(以Nokia S40或S60居多)开发游戏程序。这是现在大部分J2ME程序员从事的工作。
需要熟练掌握:高级用户界面、低级用户界面、线程,如果是网络游戏,还需要熟练网络编程。
2、J2ME应用开发人员
现在的移动应用还不是很多,但是还是出现了一些,特别是移动定位以及移动商务相关的内容。需要熟练掌握:高级用户界面、线程和网络编程。
3、J2ME游戏移植人员
参照源代码,将可以在一个平台上可以运行的游戏移植到其他平台上去。例如将Nokia S40的游戏移植到S60上,或者索爱的T618等等。主要是控制屏幕坐标,有些可能需要替换一些API。
需要熟悉各平台之间的差异以及相关的技术参数,比如屏幕大小、最大jar文件尺寸等等。
五、J2ME程序设计的几个原则
1、使用面向对象编程。
虽然使用面向过程编程可以减小文件的尺寸,但是为了以后维护的方便和利于扩展,还是要使用面向对象编程。
2、使用MVC模式
将模型、界面和控制分离。现在很多的程序将三者合一,但是如果你做的程序比较大的话,还是建议你进行分离。
3、自动存储用户设定
使用RMS来存储用户的信息,例如存储用户上次输入的用户名、密码、用户对于系统的设定等,这样不仅可以减少用户的输入,而且对用户友好。很多程序甚至做了自动登陆等。
4、一些系统设置允许用户关闭。如背景音乐、背景灯显示等。
5、将低级用户界面的绘制动作放在一个独立的线程里面去。
6、在需要大量时间才能完成的工作时,给用户一个等待界面。
六、从模拟器到真机测试
对于J2ME开发者来说,模拟器给我们带来了很多方便,比如可以在模拟器中调试程序以及很方便的察看程序的效果,但是模拟器也给我们带来了一些问题,比如模拟器实现的bug等等,所以进行真机测试是必须的。
1、为什么要进行真机测试?
因为模拟器程序可能存在bug,以及真机的性能有限,所以必须进行真机测试。
2、如何将程序传输到机器中?
将程序传输到机器中有如下方式:
a) OTA下载
b) 使用数据线传输
c) 红外传输
d) 蓝牙
你可以根据条件,选择合适的方式。
3、 真机测试主要测什么?
真机测试的内容很多,主要测试以下几个方面:
a) 程序的功能
b) 程序的操作性,是否易操作
c) 程序的大小,比如Nokia S40系列的手机大部分接受的最大文件尺寸为64K
d) 程序运行速度,速度是否可以忍受。
七、从WTK到厂商SDK
对于J2ME爱好者来说,基本上大家都是从SUN的WTK(J2ME Wireless Toolkit)开始的,但是对于实际应用来说,仅仅使用WTK是远远不够的,所以在学习过程中,必须完成从WTK到SDK的跨越。
1、厂商SDK的下载地址?
·Nokia
Nokia不愧为手机行业的老大,对于j2me的支持也是一流的,有专门的网站提供SDK和各种文档说明。
网址是:http://forum.nokia.com.cn/sch/index.html
·Siemens
Siemens对于J2ME的支持也不错,它提供了SDK,模拟器需要独立安装。下载地址如下:
https://communication-market.siemens.de/portal/main.aspx?LangID=0&MainMenuID=2&LeftID=2&pid=1&cid=0&tid=3000&xid=0
·SonyEricsson
SonyEricsson SDK以及自己的模拟器,下载地址为:
http://developer.sonyericsson.com/site/global/docstools/java/p_java.jsp
http://mobilityworld.ericsson.com.cn/development/download_hit.asp
·Motorola
Motorola提供了专门的SDK
1.具备良好的java语言基础,不要还没有学习java语言就拿起一本J2ME的书来看。这样效果并不好,相反如果你有良好的java语言基础的话,J2ME就显得比较容易掌握!
2.如果你决定开始学习J2ME了,那么首先你应该清楚J2ME的体系结构是什么样的。当你真正清楚了Configuration和Profile的关系、了解了CDC和CLDC的区别后,那么你可以开始编写自己的H elloWorldMIDlet了
3.选择优秀的开发环境,J2ME的开发环境比较灵活。我推荐使用Eclipse和EclipseME插件。因为Eclipse的插件非常丰富且灵活,当你开发联网应用程序的时候安装Lomboz就可以了。当然你也可以选择Jbuilder等IDE,但是不推荐记事本!
4.在编写代码之前,应该多读一下好的代码。毕竟MIDlet的写法和一般的java Application不是很一样。推荐WTK中的Demo程序。
5.MIDP的API doc比较少,每个类的方法也很少。如果有时间的话,每天看个4-5个。这会对你帮助很大。毕竟它的API和J2SE的并不一样,只是它的子集,不应该想当然的使用。
6.清楚MIDP中高级UI和低级UI类的使用和区别,在你做用户界面的之前,思考好什么符合你的要求,推荐使用高级UI,这样更简单、可移植性更好。但是需要使用Canvas的时候不要犹豫,大胆使用!清楚高级事件和低级事件处理的机制。
7.在开发应用程序的时候尽量使用MVC模式,这样扩展性出色。彻底掌握Record Management System,这是MIDP的一个重要子集。实现数据持久性存储不可缺少的系统。善于使用RecordFilter和RecordEnumeration来简化RMS的操作,在我的blog里面有一系列的关于RMS的文章,有时间就看看吧!
8.重视线程,如果你还不真正清楚线程的时候的话,那么赶快找资料看看吧。在J2ME的开发中,这非常的重要。具备了联网的能力则给你的应用程序插上了翅膀,而联网的时候为了避免堵塞一定要使用多线程技术。
9.时刻关注最新的技术,比如PIM,BlueTooth等都在慢慢的得到支持。你可以使用WTK2.2开发相关的程序了。
10.掌握Java中文问题,在J2ME中这个问题更加突出。你应该把你的应用程序放到手机上去测试这个问题而不是在模拟器上。
11.IO不用我说你也必须清楚,在J2ME中提供的IO包中,类比较少你更应该注意。
12.不要因为听说手机资源受限,在写程序的时候就顾虑重重,不要牺牲代码的可读性和可维护性,但是也不能乱用。这个时候你的java语言的基础起到了重要的作用!
13.如果想开发游戏,那么你应该多读相关的书籍。
14.如果有些问题想了很久都没有明白的话,可以到论坛上去问问,但是不要一有问题就问,自己思考后得到正确答案效果更好。或者把问题放下几天,也许自然而然就明白了!不是胡说。
15.多写代码!多多总结!简单的八个字,非常重要:)
本文描述了在J2me中开发主要使用的网络连接方法,分别详细介绍了使用http和socket两种方法。
HttpConnection
首先我们先来看一个简单的例子吧:
主要用到的java包:
javax.microedition.io.*;
public String requestGET(String URLString,String URL) throws IOException{
// =====================================
// URLString是HTTP地址,URL为后面的参数
// 这里的例子是发送用的用户名和密码到服务器端进行用户验证
// 比如 String URLString = "http://192.168.0.1:8080/login.jsp";
// String URL = "?Name="+this.txtName+"&Pass="+this.txtPass
// =====================================
HttpConnection hpc = null;
DataInputStream dis = null;
boolean newline = false;
String content = "";
try{
// =====================================
// 建立连接
// =====================================
hpc = (HttpConnection)Connector.open(URLString+URL);
hpc.setRequestMethod(HttpConnection.GET);
dis = new DataInputStream(hpc.openInputStream());
int character;
// =====================================
// 读取返回的HTTP内容
// ====================================
while((character = dis.read()) != -1){
if((char)character == '\\'){
newline = true;
continue;
}
else{
if((char)character =='n'&& newline){
content +="\n";
newline = false;
}
else if(newline){
content +="\\" +(char)character;
newline = false;
}
else{
content +=(char)character;
newline = false;
}
}
}
}
catch(IOException e){
System.out.print("ERROR:"+e);
}
finally{
if(hpc != null){
hpc.close();
hpc = null;
}
if(dis != null){
dis.close();
}
}
// ====================================
// 由于内容可能有中文,所以在接受到信息后要对内容进行字符集的转换
// ====================================
content = (unicodeTogb2312(content)).trim();
return content;
}
public static String unicodeTogb2312(String s){
if (s==null){ return ""; }
if (s.equals("")){ return s; }
try{
return new String(s.getBytes("ISO8859_1"),"gb2312");
}
catch(Exception uee){
return s;
}
}
以上就是一个简单的HTTP连接并且从服务器获取响应信息的例子,应该很简单了吧。客户端就是上面那个样子,服务器端只要配置好IIS,增加一个网页来对客户端的请求做出响应就行了,其实跟一般的网页请求没有多大区别,很简单吧!!
上面的Socket客户端连接程序就应该算是完工了,下面是搭建服务器端对客户端的连接进行响应。建立服务器端程序,只需要有以下代码即可:
SocketConnection
下面还是从实例入手讲一下J2me的Socket编程。
程序首先打开以IP地址为192.168.0.1:6666的Socket连接,如果连接失败则抛出异常,程序结束。如果Socket连接成功,则继续。
public boolean SocketConn(String s) throws IOException{
// ==================================
// s是Socket连接字符串
// 这里的例子是发送用的用户名和密码到服务器端进行用户验证
// 比如 String s = "socket://192.168.0.1:6666"
// ==================================
private StreamConnection conServer;
private String strServerAddr;
private boolean bConnected;
conServer = null;
strServerAddr = s; // 连接地址
bConnected = false; // 连接状态
try
{
conServer = (StreamConnection)Connector.open(strServerAddr);
}
catch(Exception exception)
{
System.out.println("Connect server error");
bConnected = false;
return false;
}
bConnected = true;
System.out.println("connect ok!");
return true;
}
上面的Socket客户端连接程序就应该算是完工了,下面是搭建服务器端对客户端的连接进行响应。建立服务器端程序,只需要有以下代码即可:
……….
try{
// 建立端口为6666的socket服务器
ServerSocketConnection SocketSer;
SocketSer = (ServerSocketConnection)Connector.open("socket://:6666");
// 等待客户端连接
SocketConnection sc;
// 如有连接,则新增一个线程对连接进行处理
sc = (SocketConnection)SocketSer.acceptAndOpen();
……….
while(true){
// 对sc的InputStream和OutPutStream进行处理
}
}
……….
在这里需要说明一下我的看法,手机通过Socket连接上服务器后,由于我用的是中国移动的号码,所以跑的是GPRS通道,我所建立的服务器连接所获得的客户端IP只是一个虚拟IP,而这个IP估计是以用户当前最近的移动机站的编码通过一些变化而产生的,所以当用户不停的移动的时候,IP也许会发生变化(这里我就不太清楚了),有兴趣的可以去看看“移动虚拟IP技术”相关的报道。本来我以前的想法是用户连接到服务器后只要IP不变就可以实现服务器向客户端广播数据,但是这个IP并非是长连接,服务器在广播数据的时候也许会有很大部分的客户端的IP会出现变化,所以最后还是采用由客户端主动发送信息的形式。感觉有点扯远了,还是回到正题吧。
客户端在建立Socket连接成功后,即可向服务器发送信息,以下是发送信息模块
protected boolean sendData(byte abyte0[])//自己替换[]
{
System.out.println("send :" + bConnected);
// 判断连接情况
if(!bConnected)
return false;
OutputStream outputstream = null;
try
{
outputstream = conServer.openOutputStream();
// 写信息到outputstream中
outputstream.write(abyte0);
// 我的理解是强制送出所有已经写了的信息
outputstream.flush();
outputstream.close();
}
catch(Exception exception)
{
System.out.println("Send Data error");
bConnected = false;
try
{
if(outputstream != null)
outputstream.close();
// 调用断开连接的函数
disconnect();
}
catch(Exception exception1) { }
return false;
}
return true;
}
下面是读取服务器响应的信息
,其他的就不一一说了,把outputstream改为inputstream,然后使用inputstream的read方法就可以了。
…………..
inputstream = conServer.openInputStream();
…………..
█前言
本文内容的所有操作皆在Windows 200操作系统上经过测试。如果您在不同的平台上验证本文内容,例如Windows 98或是Windows Me,则我们无法保证会有相同的结果。
█简介
不知从什幺时候开始,我们突然感觉到周围的人各各拥有一只手机。利用手机与别人沟通成了我们生活的一部份。北欧某些先进国家的人民可以利用手机购买自动售货机所出售的商品;他们也可以在从事行动商务(m-commence) 交易时利用手机做为一种认证工具。在日本,行动电话的许多附加功能更是年轻人文化的一部分。即将来临的3G,无线宽频的美梦带给了人们对无线通讯未来的期待。
然后,有些厂商开始行销它们自己生产的PDA,好象没有一台PDA在手,就不像现代人似的。各式各样的PDA充斥市面,畅销的与不畅销的,让人眼花撩乱。这时产生了一个大问题–要我们同时携带手机和PDA是一件很麻烦的事情-就算它们都还算轻薄短小。如果可以把手机和PDA合而为一岂不是更方便吗? 于是听到消费者心声的厂商,开始有推出手机和PDA合而为一的产品,从NOKIA 9000、Motorola A6188(太极),到最近要推出的Ericsson R380、NOKIA 9210,都是手机与PDA结合的例子,虽然因为售价的关系,但是这些产品仍然是许多人梦寐以求的高阶产品。
尽管有了PDA与手机结合的产品出现,我们仍然觉得有所不足,我想大家一定发现了,就是应用程序的不足,虽然手机和PDA 结合了,可是这些产品上的PDA功能看起来似乎是死的。我们可以任意在PalmOS、Windows CE、EPOC等PDA上使用C/C++或是Java编写这些平台上的应用程序,但是却从未有过机会将我们写好的程序下载到这些手机上执行(即使有些手机的PDA也是使用EPOC,如Ericsson R380)。
相信厂商也听到我们这些喜欢到处写程序的工程师的心声了,所以从2000年年底开始,即将陆陆续续有许多支持Java的手机即将推出,当然,这些厂商也提供了在手机上开发程序的SDK,我们终于可以在手机上面写些小程序自娱了!这是以前等了很久的美梦。
手机平台的多样性与复杂性,和PDA比较起来可以说是有过之而无不及,于是大家就可以知道 – 哈!又是Java派上用场的时候了。我们都知道在浏览器上执行的Java程序叫做Applet,在PalmOS上执行的Java程序叫做Spotlet,然而在手机上执行的应用程序我们称做MIDlet,相信对大家来说都是一个陌生的名词,这也就是本篇文章所要介绍的主角。
支持Java的手机大厂目前已知有NOKIA (预计在2001年年初推出一款支持Java的手机NOKIA 9210)、Motorola(会先在支持integrated Digital enhanced network(iDen)网络的手机上支持Java,然后再推出支持Java的GSM手机,该公司的手机大致会在2002年前全部支持Java)以及NTT DoCoMo(将在明年第二季度左右推出支持Java的手机)。
虽然这些大公司都准备支持Java,不过在决定编写本文时,只有Motorola将其SDK开放于网站上供程序开发者下载测试,所以本文内容都是根据Motorola J2ME SDK所编写。又由于这些手机市面上无法取得,所以我们的程序都是在SDK内附的模拟器中执行,相信最后这些手机上市时,我们所编写的MIDlet应该会很容易并成功地在Motorola的手机上执行才对。
█如何取得Motorola J2ME SDK
我们要做的第一件事情当然还是要先取得SDK罗!
请直接到https://commerce.motorola.com/idenonline/ideveloper/下载Motorola J2ME SDK Drop 7。如果您不是iDEN® Developer的会员,请先在网络上注册(免费)。注册成功之后,Motorola会将密码寄到您的email信箱之中,然后使用该密码登入网页上的My Development Center。进入之后选择网页上头的TOOLS & RESOURCES以进入可下载的开发工具的网页,请选择Motorola J2ME SDK Components Developer Edition, Drop 7.0下方的下载超连结以下载SDK,整个SDK的大小约为3 MB左右。
请注意下载前的Download Page for Motorola J2ME™ SDK安装说明,里头会告诉你安装密码,请先行记下。稍后当您在您的电脑上安装Motorola J2ME SDK的时候,会询问您安装密码,所以请务必记下该密码。
█Motorola J2ME SDK的安装
安装需求
根据官方需求,安装Motorola J2ME SDK的基本配备为:
Pentium 100 MHz微处理器
64 MB RAM
Windows NT WorkStation 4.0配合Service Pack 3 / Win98
(本文是在Windows 2000 Professional中文版上测试)
约6 MB的硬盘空间
Java 2 SDK 1.2.2
(本文使用Java 2 SDK 1.3.0_01作测试)
安装Motorola J2ME SDK
要安装新版Motorola J2ME SDK之前,请先确认您已经将旧版的Motorola J2ME SDK完全删除。您可以由控制台里头的 「新增/删除程序」的功能删除旧版Motorola J2ME SDK。之后再将旧版Motorola J2ME SDK安装所在路径清除即可。
解开您从Motorola网站上下载的ZIP文件,您会看到一个名为Motorola_SDK.exe的文件,双击此文件即可开始安装动作。请注意,在安装时系统会要求您输入密码,请输入之前所纪录的安装密码即可。
█Motorola J2ME SDK目录结构
当您成功地安装Motorola J2ME SDK之后,其目录结构如下图:
█MIDlet程序结构
在手机上执行的程序我们统称MIDlet,其程序结构很简单,与大家熟悉的Applet结构有异曲同工之妙。
每一个MIDlet程序都必须继承自javax.microedition.midlet.MIDlet类别,并实做三个函式,它们分别是:
protected void startApp()
protected void pauseApp()
protected void destroyApp(Boolean unconditional)
而一个MIDlet程序的起始与结束之流程我们以下图来表示:
█编写并编译MIDlet
请先到您的Motorola J2ME SDK安装目录下的demo\midlets目录底下新建一个名为HelloMIDlet.java的文件,其内容为:
HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet
{
HelloMIDlet()
{
}
protected void startApp() throws MIDletStateChangeException
{
}
protected void pauseApp()
{
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}
在demo\midlets目录之中您会看到一个名为compileAll.bat的批处理文件,前面有提到,这个批处理文件除了可以帮助您编译所有内附范例程序之外,还可以简化您自己所编写的MIDlet之编译流程。
请在命令列视窗输入: compileAll HelloMIDlet.java
如果成功编译,屏幕上输出的结果如下图所示:
从屏幕上的输出,您可以发现,要让MIDlet可以在手机上执行,大体上还是要经过两个动作(与Spotlet相似),分别是编译(compiling)以及预先审核(Preverifying)。
有关预先审核这个动作,笔者已经在RUN!PC 11月号的文章「利用Java 编写PalmOS应用程序基础篇」之中有向读者们提过,如果对这个方面有所疑问的朋友,请再将您的RUN!PC 11月号翻出来复习一下吧!
从这个简短的MIDlet制作流程里头,相信大家可以发现,比起纯粹用Sun的CLDC编写能在KVM上执行的Spotlet要简单上许多。原因是compileAll.bat这个批处理文件帮我们做掉大部分dirty work。
那幺,如果您写好的程序并非放在demo\midlets目录之中,是否就无法编译了? 从compileAll.bat里头,我们可以发现它帮我们完成上述两项工作的指令。如果我们写好的程序放在demo\midlets目录以外的地方,您可以执行下面的指令,您仍然可以成功地制作MIDlet:
(我们假设您的Motorola J2ME SDK安装在D:\MotoSDK目录之中,并将您自行编写的HelloMIDlet.java置于d:\jdk1.3.0_01\my目录之中。同时我们假设您在d:\jdk1.3.0_01\my目录底下执行下面指令。)
编译:
javac -O -bootclasspath d:\MotoSDK\lib HelloMIDlet.java
注意: -bootclasspath指向类函数库的所在位置。
预先审核:
d:\MotoSDK\bin\preverifier -classpath d:\MotoSDK\lib;. -d . HelloMIDlet
注意:
1 . -classpath指向类函数库的所在位置,也要指向我们所编写的MIDlet所在的位置。
2 .–d指向您希望预先编译类文件产生之后所放置的路径,如果写"."表示本目录,会覆盖掉原先未经过预先编译的类文件。如果您没有指定,则预设值为".\output"目录。
当然,如果您嫌自己手动操作很麻烦,您可以将compileAll.bat复制到其它目录之中,并更改其编译指令与预先审核指令之中和类函数库有关的相关设定即可。
提到compileAll.bat,顺便向各位读者说明一下,在前面有提到,compileAll.bat可以帮助您编译所有位于demo\midlets目录下的范例程序,您只要在命列列下直接输入: compileAll即可。compileAll.bat会自动当您编译的package有以下几项:
com.mot.j2me.midlets.bounce
com.mot.j2me.midlets.imagetests
com.mot.j2me.midlets.paddleball
com.mot.j2me.midlets.scribble
com.mot.j2me.midlets.tests
com.mot.j2me.midlets.tutorials
如果您希望compileAll.bat自动帮您编译其它package底下的程序,请您开启compileAll.bat,修改其COMPILECLASS环境变数的设定即可。
█修改并执行MIDlet
写好程序之后,大家最希望的事情当然就是让它在手机上执行,不过由于目前大家无法取得Motorola这些支持Java的手机,所以我们只能在Motorola J2ME SDK内附的模拟器上执行我们写好的MIDlet。相信手机正式推出时,应该可以顺利地在手机上执行。底下笔者将告诉您如何使用Motorola J2ME SDK内附的模拟器来测试您所编写的MIDlet。
在这之前,由于之前我们所编写的范例程序只是简单的MIDlet空壳,我们必须让它能够在模拟器上显示出一些信息才可以,因此请修改上一个程序范例,使它的内容如下:
HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet
{
private Display firstDisplay ;
private Form firstForm ;
HelloMIDlet()
{
firstDisplay = Display.getDisplay(this) ;
firstForm = new Form("Hello MIDlet") ;
StringItem firstStrItem = new StringItem("Hello","MIDlet") ;
firstForm.append(firstStrItem) ;
}
protected void startApp() throws MIDletStateChangeException
{
firstDisplay.setCurrent(firstForm) ;
}
protected void pauseApp()
{
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}
请将此文件放置在\demo\midlets目录下。编译完成之后,请将目录切换到scripts子目录之中,您会在此目录里发现一些写好的批处理文件。请在该目录下执行这些批处理文件指令以启动模拟器。执行的指令与执行结果如下所示:
指令: runEmul HelloMIDlet
输出结果
指令: runMotoi1000 HelloMIDlet
输出结果
指令: runMotoiDEN HelloMIDlet
输出结果
指令: runStarTac HelloMIDlet
输出结果
指令: runMyDevice HelloMIDlet
输出结果
Error loading property file: C:/properties/mydevice.props (系统找不到指定的路径。)会出现错误信息是因为您没有指定属于是用者自订的手机外观的缘故,后面将会教您如何设定用户自订的手机外观。
如果我们将写好的程序放在demo\midlets目录以外的地方,您可以执行下面的指令,仍然可以成功地启动模拟器并执行MIDlet:
(我们假设您的Motorola J2ME SDK安装在D:\MotoSDK目录之中,并将您自行编写的HelloMIDlet.java置于d:\jdk1.3.0_01\my目录之中。同时我们假设您在d:\jdk1.3.0_01\my目录底下执行下面指令。)
执行一般模拟器 java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib javax.microedition.midlet.AppManager HelloMIDlet
-JSA 1 1
请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。
执行模拟器并套用i1000手机外观
java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib
-deviceFile resources\Motorolai1000.props
javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。
执行模拟器并套用iDEN手机外观 java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib
-deviceFile resources\MotorolaiDENPlatform.props
javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。
执行模拟器并套用StarTac手机外观 java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emu
lator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib
-deviceFile resources\StarTac.props
javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。
执行模拟器并套用用户自订手机外观 java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib
-deviceFile <您的props文件所在的绝对路径>javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
请注意:
第一个-classpath设定,-classpath与路径名称之间有空格。
第二个-classpath设定,-classpath与路径名称之间没有空格。
如果您将您的props文件放在d:\MotoSDK\bin的resources目录之下,则上述指令只要改成:-deviceFile resources\<您的props文件名>
注意,当您您直接使用上述指令启动模拟器,如果出现底下错误信息:
Error loading property file: resources/defaultdevice.props (系统找不到指定的路径。)
这是因为您没有将d:\MotoSDK\bin目录下的resources子目录复制到d:\JDK1.3.0_01\my目录之下的缘故。