﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-看看海，喝喝咖啡，写写程序——我的最爱Java-文章分类-转载</title><link>http://www.blogjava.net/jiansong/category/7251.html</link><description>&lt;a target=blank href=http://wpa.qq.com/msgrd?V=1&amp;Uin=5410999&amp;Site=www.blogjava.net/jiansong&amp;Menu=yes&gt;&lt;img border="0" SRC=http://wpa.qq.com/pa?p=1:5410999:1 alt="点击这里给我发消息"&gt;&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:44:03 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:44:03 GMT</pubDate><ttl>60</ttl><item><title>动设备开发推荐网站</title><link>http://www.blogjava.net/jiansong/articles/71435.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 23 Sep 2006 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/71435.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/71435.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/71435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/71435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/71435.html</trackback:ping><description><![CDATA[
		<u>
				<font color="#800080">动设备开发推荐网站 </font>
		</u>
		<div class="postText">
				<p>SUN J2ME 技术区：  <a href="http://java.sun.com/j2me/">http://java.sun.com/j2me/</a> </p>
				<p>中国JAVA 手机网：<a href="http://www.cnjm.net/">http://www.cnjm.net/</a></p>
				<p>NOKIA 论坛 ： <a href="http://www.forum.nokia.com/">http://www.forum.nokia.com</a></p>
				<p>移动开发者论坛： <a href="http://mobisoft.cn/bbs/">http://mobisoft.cn/bbs/</a></p>
				<p>中文移动开发者博客：<a href="http://mobisoft.cn/blog/">http://mobisoft.cn/blog/</a></p>
				<p>嵌入开发网： <a href="http://www.embed.com.cn/">http://www.embed.com.cn</a></p>
				<p>
				</p>
				<p>J2ME POLISH：<a href="http://www.j2mepolish.org/">http://www.j2mepolish.org</a></p>
				<p>火狐下载中心：  <a href="http://down.skyhu.com/">http://down.skyhu.com/</a></p>
				<p>J2ME 开发网:  <a href="http://www.j2medev.com/">http://www.j2medev.com/</a></p>
				<p>A huge repository of MIDlets and the chance to make your game publicly available:    <a href="http://midlet.org/"><font color="#002c99">http://midlet.org</font></a></p>
				<p>Nice resource with mixed info on J2mE :   <a href="http://www.billday.com/j2me/"><font color="#002c99">http://www.billday.com/j2me/</font></a></p>
				<p>Mobile game review site, see what games are around and how they rate:  <a href="http://www.midlet-review.com/"><font color="#002c99">http://www.midlet-review.com</font></a></p>
				<p>Excellent collection of commercial games :  <a href="http://games.macrospace.com/"><font color="#002c99">http://games.macrospace.com</font></a></p>
				<p>Agood resource for J2ME related news, tutorials and articles :   <a href="http://www.microjava.com/"><font color="#002c99">http://www.microjava.com</font></a></p>
				<p>IGN's wireless gaming section :   <a href="http://wireless.ign.com/"><font color="#002c99">http://wireless.ign.com</font></a></p>
				<p>All the info you will need to get started with Brew :   <a href="http://www.qualcomm.com/brew"><font color="#002c99">http://www.qualcomm.com/brew</font></a></p>
				<p>List of devices and device specs :  <a href="http://www.kobjects.org/devicedb"><font color="#002c99">http://www.kobjects.org/devicedb</font></a></p>
				<p>Another detailed list of java devices :  <a href="http://wireless.java.sun.com/device/"><font color="#002c99">http://wireless.java.sun.com/device/</font></a></p>
				<p>Easy to use publicly available fixed point library for J2ME :  </p>
				<p>     <a href="http://home.rochester.rr.com/ohommes/MathFP/"><font color="#002c99">http://home.rochester.rr.com/ohommes/MathFP/</font></a></p>
				<p>Motorola's developer site: <a href="http://www.motocoder.com/"><font color="#002c99">http://www.motocoder.com</font></a></p>
				<p>The biggest mophun resource around :  <a href="http://www.mophun.com/"><font color="#002c99">http://www.mophun.com</font></a></p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.donews.net/TrackBack.aspx?PostId=304592</p>
		</div>
<img src ="http://www.blogjava.net/jiansong/aggbug/71435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-09-23 10:05 <a href="http://www.blogjava.net/jiansong/articles/71435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>polish samples的说明(初学很不错)</title><link>http://www.blogjava.net/jiansong/articles/71434.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 23 Sep 2006 02:03:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/71434.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/71434.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/71434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/71434.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/71434.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<font size="2">需要:<br /><br />jdk,wtk就不用说了.<br /><br />下载j2mepolish :</font>
				<a href="http://www.j2mepolish.org/downloads/j2mepolish-1.2.4.html#download" target="_blank">
						<font color="#404040" size="2">http://www.j2mepolish.org/downloads/j2mepolish-1.2.4.html#download</font>
				</a>
				<br />
				<br />
				<font size="2">
						<span style="COLOR: rgb(255,0,0)">直接双击jar文件(java -jar j2mepolish-1.2.4.jar)根据向导安装即可,很简单.</span>
						<br />
						<br />在eclipse中运行samples里面的menu例子.<br /><br />拷贝 ${polish.home}/samepse/menu到eclipse的工作目录.<br /><br />然后建立一个java工程名为 menu (会自动导入拷过来的menu里面的src,res等等)<br /><br />直接ant运行build脚本即可生成jar,jad文件(会发现有很多版本,不同语言,不同平台,不同midp版本的)<br /><br /><span style="COLOR: rgb(255,0,0)">要配置生成哪些版本,或者平台的jar,jad,可以在build.xml里面配置</span>,如下位置:<br /><br />&lt;deviceRequirements unless="test"&gt;<br />  &lt;requirement name="Identifier" value="Nokia/Series60, Nokia/Series60Midp2, Generic/midp2, Generic/midp1" /&gt;<br />  &lt;!-- on could use other devices for real builds, e.g. :<br />  &lt;or&gt;<br />  &lt;and&gt;<br />  &lt;requirement name="JavaPackage" value="nokia-ui" /&gt;<br />  &lt;requirement name="BitsPerPixel" value="16+" /&gt;<br />  &lt;/and&gt;<br />  &lt;/or&gt;<br />  --&gt;<br />&lt;/deviceRequirements&gt;<br /><br />语言(默认有德文和英文)可以在如下位置配置:(我把德文改称了中文)<br /><br />&lt;resources<br />  dir="resources"<br />  defaultexcludes="yes"<br />  excludes="readme.txt"<br />  &gt;<br />  &lt;!-- you can add resources based on complex criterias: <br />  &lt;fileset <br />  dir="resources/multimedia" <br />  includes="*.wav" <br />  if="polish.audio.wav" <br />  /&gt;<br />  &lt;fileset <br />  dir="resources/multimedia" <br />  includes="*.mid" <br />  if="polish.audio.midi and not polish.audio.wav" <br />  /&gt;<br />  --&gt;<br />  &lt;!-- add the localization element for created localized<br />      versions of your application: --&gt;<br />  &lt;localization locales="cn,en_US" unless="test" /&gt;<br />  &lt;localization locales="en_US" if="test" /&gt;<br />  &lt;/resources&gt;<br /><br />注意,如果配置了一个cn的话,要在resources里面添加一个messages_cn.txt<br /><br />内容可以如下:<br /><br />#######################################<br />#                         #<br />#   This file contains translations   #<br />#   of the application.           #<br />#   Key and Value are separated     #<br />#   by the equals-sign "=".       #<br />#                         #<br />#######################################<br /><br /># You can also define localized preprocessing variables here, by starting the <br /># definition with "var:". Variables defined here will override the ones defined<br /># in the &lt;variables&gt;-section of your build.xml.<br /># Variables starting with "polish." or "MIDlet-" don't need to start with "var:"<br /># by the way.<br />var:MyExampleVariable=你好,midlet<br />var:GameName=测试<br /><br /># Setting J2ME Polish variables:<br />polish.command.ok=确认<br />polish.command.cancel=取消<br />polish.command.select=选择<br />polish.command.options=选项<br /><br /># It's also possible to set MIDlet-attributes for your JAD- and MANIFEST-files here. <br /># If you like you can start them with "var:" as well, but it is not needed.<br /># Again MIDlet-attributes defined override the one defined in the &lt;info&gt;-<br /># and &lt;jad&gt;-sections of your build.xml<br />MIDlet-Description=中文哦<br />MIDlet-Name=J2ME Polish Beispiel<br />MIDlet-Delete-Confirm=J2ME Polish <br /><br /><br /><br /><br /># Setting appplication specific translations:<br /><br />cmd.StartGame=${GameName} 开始<br />cmd.Quit=退出<br />cmd.ShowLog=log 显示<br /><br />menu.StartGame=${GameName} 开始!<br />menu.LoadGame=${GameName} 读取<br />menu.Highscore=最高分<br />menu.Quit=退出<br />#menu.go=出发 <br /><br />messages.welcome=欢迎阿, {0}!!!<br /><br /><br /><br />=========================================<br /><br />这个时候在dist目录下生成了中文的不同平台和midp版本的jad,jar文件<br /><br />用模拟器运行即可看到效果<br /><br />如果要在<span style="COLOR: rgb(255,0,0)">ant的时候就打开模拟器运行,修改一下build.xml的如下地方:</span><br /><br />&lt;target name="init"&gt;<br />  &lt;property name="test" value="true" /&gt; <span style="COLOR: rgb(255,0,0)">//改为true</span><br />&lt;property name="dir.work" value="build/real" /&gt;<br />&lt;property name="deploy-url" value="" /&gt;<br />&lt;/target&gt;<br /><br /><span style="COLOR: rgb(255,0,0)">配置模拟器</span>的地方:(不需要修改,我修改是不想看到内存和网络监视的那些东西)<br /><br />&lt;emulator<br />  wait="true"<br />  trace="class"<br />  securityDomain="trusted"<br />  <span style="COLOR: rgb(255,0,0)">enableProfiler="false"   //默认true的,我改称了false</span><br style="COLOR: rgb(255,0,0)" /><span style="COLOR: rgb(255,0,0)">  enableMemoryMonitor="false" //默认true的,我改称了false</span><br style="COLOR: rgb(255,0,0)" /><br style="COLOR: rgb(255,0,0)" /><span style="COLOR: rgb(255,0,0)">  enableNetworkMonitor="false" //默认true的,我改称了false</span><br /><br />  if="test"<br />  &gt;<br />  &lt;!--<br />  &lt;parameter name="-Xjam" value="transient=http://localhost:8080/${polish.jadName}" /&gt;<br />  --&gt;<br />&lt;/emulator&gt;</font>
				<br /> <br /><br /><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1178720</p></div>
<img src ="http://www.blogjava.net/jiansong/aggbug/71434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-09-23 10:03 <a href="http://www.blogjava.net/jiansong/articles/71434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2mepolish的licence问题</title><link>http://www.blogjava.net/jiansong/articles/71433.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 23 Sep 2006 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/71433.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/71433.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/71433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/71433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/71433.html</trackback:ping><description><![CDATA[
		<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/dodorunning/1.JPG" />
		<br />
		<p>
				<font face="Verdana" color="#000000">他的license分为几种收费类型:GPL的，single的，企业的</font>
		</p>
		<p>
				<font face="Verdana" color="#000000">那么我们做商业开发是否能用它呢？能否使用GPL的license?是否必须购买商业版本呢？</font>
		</p>
		<div style="MARGIN-TOP: 10px; FONT-SIZE: 9pt; MIN-HEIGHT: 200px; TEXT-INDENT: 24px; LINE-HEIGHT: normal" onload="this.style.overflowX='auto';">
				<p>j2mepolish的license在这里：</p>
				<p>
						<a href="http://www.j2mepolish.org/licenses.html" target="_blank">http://www.j2mepolish.org/licenses.html</a>
				</p>
				<p>1.如果在项目中使用GPL license，则可以无限制的使用，前提是你的项目必须遵循GPL。</p>
				<p>2.Commercial Licenses（商业许可证）</p>
				<p>分为：Developer Seat、Single License、Runtime License、Enterprise License</p>
				<p>根据功能，价格不一</p>
				<p>Why do I need a commercial license?</p>
				<p>我为何需要一个商业许可证？</p>
				<p>The GNU GPL license requires you to publish your completely source code solely under the GNU GPL again. That's why the alternative commercial licenses exist.</p>
				<p>GNU GPL许可证要求你在GNU GPL下，独立的完全公开你的源代码。这就是为什么会存在两种单独的商业许可证。</p>
		</div>
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1203988</p>
<img src ="http://www.blogjava.net/jiansong/aggbug/71433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-09-23 10:02 <a href="http://www.blogjava.net/jiansong/articles/71433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME内存优化</title><link>http://www.blogjava.net/jiansong/articles/29629.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sun, 05 Feb 2006 13:23:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/29629.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/29629.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/29629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/29629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/29629.html</trackback:ping><description><![CDATA[本文来自<A href="http://www.matrix.org.cn/resource/article/1/1561.html">http://www.matrix.org.cn/resource/article/1/1561.html</A> 
<DIV id=divarticlecontent>out momory 一阵天旋地转内存又溢出了。在手机上这种痛苦经常都有，套一句俗话在手机上用内存必须勒紧裤腰带。虽然现在pc内存上G都不奇怪,可是在手机上却只能以K来记,可能某位同志会马上跳出来说也有上M的，记住中国还不富大多数手机都是低端手机。写手机程序让我仿佛回到了dos时代（自我安慰一下那个时代也炼出了不少高手说不定我是下一个）。言归正传做内存优化可以归结为以下几种方法。代码优化，图片优化，第三方工具优化等…<BR><BR><B>一．代码优化</B> <BR>内存会溢出肯定和代码逃不了关系,99.99%学java的人都知道垃圾回收器是java的一大优点并据此来嘲笑C++。显然这个特性为代码编写者省了不少事，但这个特性却带来了不少隐患。举个例子在游戏当中经常有不同场景的切换，如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器来收尸^_^。乍看之下似乎并无不妥垃圾回收器会来善后。实际上垃圾回收器并非实时的,它不像C++的Delete语句马上释放不用的内存。当从游戏逻辑切换到主菜单逻辑这时两个对象同时存在很可能这时内存就不够用了。读到这里很多人会发现实际上垃圾回收器在j2me上并不怎么好用，从一个角度上来讲在j2me上所有垃圾必须由手工释放,除简单类型以外所有对象都必须显式地置空例如 imgs=null; 实际上java提供了一个不错的工具用来查找内存溢出,java.lang.Runtime.freeMemory() 。它可以返回当前的剩余内存数，将它适当的安放在代码中可以有效的监测内存使用状况。很大一部份的j2me程序员之前都是从事pc软件开发工作，充裕的内存掩盖了许多写代码的不良习惯。如下所示:<BR>//a 不为空<BR>a=new Logic();<BR>很多人可能对此有异议，他们会认为新的对象会把旧的对象冲掉并且释放内存。这里面包含两个问题：1. 该段代码是先创建对象然后再进行赋值操作的，也就是说在这期间有两个对象同时存在这就很可能会产生溢出。2. 这样做也会妨碍垃圾回收器的工作<BR>较好的写法如下:<BR>a=null;<BR>a=new Logic(); <BR>虽然麻烦了点但在j2me中还是必要的。接着看下例。<BR>drawString("游戏时间:" + time ,50,50,Graphics.LEFT|Graphics.TOP);<BR>"游戏时间:" + time 很完美在paint()方法当中每次都被刷一遍显示在屏幕上。危机往往隐藏在美丽的外表，该语句会引起新的内存重新分配来存储 "游戏时间:" + time 而显示完以后又必须由垃圾回收器释放，用了双倍时间,并且容易发生内存溢出。依此类推在重复执行的方法里应尽量避免重复定义对象。与paint()方法类似在循环里也有类似的情况存在。 <BR>把所有对象的初始化放在构造函数里想必是再正当不过了,大多数人通常的做法是把当前逻辑所要用到的资源通通初始化完毕。<BR>很大一部份的内存溢出都是发生在构造函数中。内存使用的高峰期都是在构造函数中所以避开这个高峰能有效的防止溢出。建议最好的办法是第一次使用时初始化。如下所示<BR>if (img==null){<BR>//初始化<BR>}<BR>现在做游戏很多时候都需要地图数组，声音数组，还有一些其它资源这些资源很多可以放在代码中也有的可以放在文件当中。<BR>强烈建议将这些资源放在文件中需要时在load进来。这些资源文件如果放在代码中则会占用不小的代码段空间，而代码一般是程序一运行就装载到内存当中。<BR>除上面列举的方法外还有一些大家所熟知的顺便一提, 比如关闭没用的rms ，关闭没用的网络连接，关闭没用的流。正确地停止线程。良好的程序架构减少代码偶合性也是一个不错的方法，无论在代码调式，内存释放都可以做到非常清析。<BR><BR><B>二. 图片优化</B><BR>j2me的内存杀手无疑非图片莫属,一张3k的图片可以占用20多k的内存不信大家把load前后的内存剩余打印出来对比看看。所以防止内存溢出最直接的办法就是从图片入手。<BR>1．图片压缩: 多数人马上会想到这个办法。不错这个办法是最有效的。在photoshop里图片制作完成后不要选择 "存储为"，而是选择 "存储为 web 所用格式" 可以根据里面的选项进行压缩，特别是颜色这一项越小越好不过相应的图像会有所失真。不要认为这样就完了。<BR>实际上该图片还可以再次压缩，在网上有许多类似的工具。推荐一款可以压缩png格式的软件 xat.com Image Optimizer 效果不错。经常都有 70% 的压缩率且图像不会失真。<BR>假如你有多张规格一样的图片，那么建议你把它做成一张长条图片。有两个原因： <BR>1、 这样节省存储空间和内存空间。大家可做个试验将10张图片的内容放在一张当中对比看看文件大小有没有变化。<BR>2 、10张图片需要10个image 对象需要进行10次io操作浪费时间不说还浪费内存。当笔者发现这个好处时兴奋地把所有图片都存成一张，吱地一声内存又溢出了...原因想必大家也知道!！图片太大了不要把不同界面的图片整合在一起否则经常会得不偿失。<BR>作图时还有一些细节需要注意,颜色数量，分辩率，图像模式（最好是索引颜色),画布大小都会影响到图片大小。<BR><BR><B>三． 工具优化</B><BR>谁都知道混淆器是用来保护代码的以加大反编译的难度(个人认为这是在嘲笑程序员的智商）。实际上用它来优化程序也是不错的选择，至少有两点好处：1、 压缩程序大小。一个60k的程序经常可以压掉10k左右。10k的空间对于写低端手机的程序员简直是雪中送碳，多少超过64k限制的游戏都受过它的恩惠；2、节省内存空间。用脚去想也想得出来代码少了内存里的代码段自然就短了。<BR>根据经验很多人都会用jb自带的混淆器RetroGuard，实际上它效果并不怎么好。推荐使用proguard 在 http://sf.net 可以免费下载，它可以比retroguard 多压缩3至4 k 以上而且安全性更好。<BR></DIV><img src ="http://www.blogjava.net/jiansong/aggbug/29629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-02-05 21:23 <a href="http://www.blogjava.net/jiansong/articles/29629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME开发资源 - 优秀站点推荐（转载） </title><link>http://www.blogjava.net/jiansong/articles/29531.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 04 Feb 2006 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/29531.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/29531.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/29531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/29531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/29531.html</trackback:ping><description><![CDATA[<DIV onload="this.style.overflowX='auto';">J2ME开发站点资源：<BR><BR>英文：<BR><BR>http://java.sun.com/j2me/index.jsp<BR>SUN公司J2ME平台的官方站点，许多权威资料都可以在此找到。<BR><BR><BR>http://jcp.org/en/jsr/tech?listBy=1&amp;listByType=platform<BR>J2ME平台的所有JSR规范，这是jcp的官方站点。<BR><BR><BR>http://www.microjava.com<BR>非常全面的j2me开发站点，内容丰富，包括各种示例，还能找到许多设备的资料。<BR><BR><BR>http://www.onjava.com/topics/java/Wireless_Java<BR>O'Reilly onjava的j2me版，以文章教程为主。<BR><BR><BR>http://www.corej2me.com/<BR>以书籍为主的j2me站点<BR><BR><BR>http://www.wirelessdevnet.com/<BR>又一个教程/下载都很丰富的j2me开发站点<BR><BR><BR>http://www.mobilegd.com/<BR>主要以J2ME游戏开发为主的站点<BR><BR><BR>中文：相对于英文站点，国内专注于J2ME的技术站点还特别少，重点推荐以下站点：<BR><BR>http://www.j2medev.com<BR>国内最大的专注于J2ME开发的开发者站点，以原创文章/教程/应用游戏下载为主，值得推荐！<BR><BR><BR>http://www-128.ibm.com/developerworks/cn/java/index.html<BR>IBM开发者社区也有不少不错的J2ME教程。<BR><BR><BR>http://j2me1.motorola.com.cn/index_ch.asp<BR>MOTO的中文开发站点，可以下载到moto的SDK<BR><BR><BR>各大手机厂商的开发站点：<BR><BR>Nokia: http://www.forum.nokia.com<BR>Moto: http://www.motocoder.com<BR>Sony-Ericcson: http://developer.sonyericsson.com/site/global/home/p_home.jsp<BR><BR><BR>手机应用下载/手机游戏下载：<BR><BR>http://www.imobile.com.cn/<BR>手机之家<BR><BR><BR>http://www.mbook.com.cn<BR>掌上书院<BR></DIV><img src ="http://www.blogjava.net/jiansong/aggbug/29531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-02-04 14:29 <a href="http://www.blogjava.net/jiansong/articles/29531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2ME程序开发新手入门九大要点（转载） </title><link>http://www.blogjava.net/jiansong/articles/29529.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 04 Feb 2006 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/29529.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/29529.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/29529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/29529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/29529.html</trackback:ping><description><![CDATA[一、<A class=bluekey href="http://www.yesky.com/key/4494/169494.html" target=_blank><FONT color=#1d58d1>J2ME</FONT></A>中需要的Java基础知识<BR><BR>　　现在有大部分人，都是从零开始学J2ME的，学习J2ME的时候，总是从Java基础开始学习，而且现在讲Java基础的书籍中都是以J2SE来讲基础，这就给学习造成了一些不必要的麻烦，下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明。<BR><BR>　　J2ME中使用到的Java基础知识：<BR><BR>　　 1、Java语法基础：包括基本数据类型、关键字、运算符等等<BR><BR>　　 2、面向对象的思想：类和对象的概念，继承和多态等等。<BR><BR>　　 3、异常处理<BR><BR>　　 4、多线程<BR><BR>　　J2ME中没有用到的Java基础知识：<BR><BR>　　 1、JDK中javac和java命令的使用 <BR><BR>　　 2、Java基础中的很多类在J2ME中没有，或者类中的方法做了大量的精简。所以建议在J2ME中熟悉类库。<BR><BR>　　 3、Applet、AWT、Swing这些知识在J2ME中根本使用不到。<BR><BR>　　简单说这么多，希望学J2ME的朋友们能少走一些弯路，不足之处希望大家积极指正和补充。 <BR><BR>　　二、J2ME中暂时无法完成的功能<BR><BR>　　列一些J2ME中暂时无法完成的功能，希望大家能积极补充：<BR><BR>　　 1、在手机中不更改代码实现移植，主要指游戏。<BR><BR>　　 2、动态修改按钮文字。<BR><BR>　　 3、在Canvas上接受中文输入。<BR><BR>　　 4、操作本地资源、例如地址本、已收短信息等。<BR><BR>　　 5、制作破坏性的手机病毒。<BR><BR>　　 6、其他等待大家来补充。<BR><BR>　　三、J2ME的跨平台性<BR><BR>　　J2ME技术源于Java，所以也具有JVM的优势，可以在支持Java的平台上进行移植，但是现在的J2ME技术在跨平台上却做的很糟糕，我们来简单看一下原因：<BR><BR>　　1、手机的屏幕尺寸不一：<BR><BR>　　这个主要在界面制作上。如果你使用的是高级用户界面，比如你做的是应用开发或者用户登陆、用户注册这样的通用功能时，一般没有什么问题。<BR><BR>　　如果你使用的是低级用户界面，比如你做的是游戏，那么你就需要考虑这个问题了。<BR><BR>　　2、厂商的扩展API不统一：<BR><BR>　　例如Nokia的扩展API类库UI系列，在别的手机上或者没有实现，或者包名不同等等。<BR><BR>　　3、手机平台上实现的bug：<BR><BR>　　例如Nokia的7650在实现双缓冲上有bug，那么在这种机型上运行的软件就不能使用双缓冲。其他NOKIA上的一些bug，可以参看：http://blog.<A class=bluekey href="http://www.yesky.com/key/379/170379.html" target=_blank><FONT color=#1d58d1>csdn</FONT></A>.net/Mailbomb/archive/2005/03/24/329123.aspx<BR><BR>　　4、手机性能问题。<BR><BR>　　不同手机的可用内存、最大jar文件都有要求，例如Nokia S40的大部分手机支持的最大jar文件为64K，最大可用内容为210K。<BR><BR>　　所以现在的手机软件，特别是游戏都提供支持的机型列表，也才有了手机游戏移植人员的存在。<BR><BR>　　四、学习J2ME可以从事的工作种类<BR><BR>　　现在J2ME技术可以说相当的火暴，这里介绍一些学好了J2ME之后可以从事的工作的种类：<BR><BR>　　1、J2ME游戏开发人员<BR><BR>　　根据游戏策划或者文档要求，在某种特定的机型(以Nokia S40或S60居多)开发游戏程序。这是现在大部分J2ME程序员从事的工作。<BR><BR>　　需要熟练掌握：高级用户界面、低级用户界面、线程，如果是网络游戏，还需要熟练网络编程。<BR><BR>　　2、J2ME应用开发人员<BR><BR>　　现在的<A class=bluekey href="http://www.yesky.com/key/1018/176018.html" target=_blank><FONT color=#1d58d1>移动应用</FONT></A>还不是很多，但是还是出现了一些，特别是移动定位以及移动商务相关的内容。需要熟练掌握：高级用户界面、线程和网络编程。<BR><BR>　　3、J2ME游戏移植人员<BR><BR>　　参照源代码，将可以在一个平台上可以运行的游戏移植到其他平台上去。例如将Nokia S40的游戏移植到S60上，或者索爱的T618等等。主要是控制屏幕坐标，有些可能需要替换一些API。<BR><BR>　　需要熟悉各平台之间的差异以及相关的技术参数，比如屏幕大小、最大jar文件尺寸等等。<BR><BR>　　五、J2ME程序设计的几个原则<BR><BR>　　1、使用面向对象编程。<BR><BR>　　虽然使用面向过程编程可以减小文件的尺寸，但是为了以后维护的方便和利于扩展，还是要使用面向对象编程。<BR><BR>　　2、使用MVC模式<BR><BR>　　将模型、界面和控制分离。现在很多的程序将三者合一，但是如果你做的程序比较大的话，还是建议你进行分离。<BR><BR>　　3、自动存储用户设定<BR><BR>　　使用RMS来存储用户的信息，例如存储用户上次输入的用户名、密码、用户对于系统的设定等，这样不仅可以减少用户的输入，而且对用户友好。很多程序甚至做了自动登陆等。<BR><BR>　　4、一些系统设置允许用户关闭。如背景音乐、背景灯显示等。<BR><BR>　　5、将低级用户界面的绘制动作放在一个独立的线程里面去。<BR><BR>　　6、在需要大量时间才能完成的工作时，给用户一个等待界面。<BR><BR>　　六、从模拟器到真机测试<BR><BR>　　对于J2ME开发者来说，模拟器给我们带来了很多方便，比如可以在模拟器中调试程序以及很方便的察看程序的效果，但是模拟器也给我们带来了一些问题，比如模拟器实现的bug等等，所以进行真机测试是必须的。<BR><BR>　　1、为什么要进行真机测试？<BR><BR>　　因为模拟器程序可能存在bug，以及真机的性能有限，所以必须进行真机测试。<BR><BR>　　2、如何将程序传输到机器中？<BR><BR>　　将程序传输到机器中有如下方式：<BR><BR>　　 a)　OTA下载<BR><BR>　　 b)　使用数据线传输<BR><BR>　　 c)　红外传输<BR><BR>　　 d)　蓝牙<BR><BR>　　你可以根据条件，选择合适的方式。<BR><BR>　　3、 真机测试主要测什么？<BR><BR>　　真机测试的内容很多，主要测试以下几个方面：<BR><BR>　　 a)　程序的功能<BR><BR>　　 b)　程序的操作性，是否易操作<BR><BR>　　 c)　程序的大小,比如Nokia S40系列的手机大部分接受的最大文件尺寸为64K<BR><BR>　　 d)　程序运行速度，速度是否可以忍受。<BR><BR>　　七、从WTK到厂商SDK<BR><BR>　　对于J2ME爱好者来说，基本上大家都是从SUN的WTK(J2ME Wireless Toolkit)开始的，但是对于实际应用来说，仅仅使用WTK是远远不够的，所以在学习过程中，必须完成从WTK到SDK的跨越。<BR><BR>　　1、厂商SDK的下载地址？<BR><BR>　　·Nokia <BR><BR>　　Nokia不愧为手机行业的老大，对于j2me的支持也是一流的，有专门的网站提供SDK和各种文档说明。<BR><BR>　　网址是：<A href="http://forum.nokia.com.cn/sch/index.html" target=_blank><FONT color=#1d58d1>http://forum.nokia.com.cn/sch/index.html</FONT></A><BR><BR>　　·Siemens<BR><BR>　　Siemens对于J2ME的支持也不错，它提供了SDK，模拟器需要独立安装。下载地址如下：<BR><BR>　　<A href="https://communication-market.siemens.de/portal/main.aspx?LangID=0&amp;MainMenuID=2&amp;LeftID=2&amp;pid=1&amp;cid=0&amp;tid=3000&amp;xid=0" target=_blank><FONT color=#1d58d1>https://communication-market.siemens.de/portal/main.aspx?LangID=0&amp;MainMenuID=2&amp;LeftID=2&amp;pid=1&amp;cid=0&amp;tid=3000&amp;xid=0</FONT></A><BR><BR>　　·SonyEricsson<BR><BR>　　SonyEricsson SDK以及自己的模拟器，下载地址为：<BR><BR>　　<A href="http://developer.sonyericsson.com/site/global/docstools/java/p_java.jsp" target=_blank><FONT color=#1d58d1>http://developer.sonyericsson.com/site/global/docstools/java/p_java.jsp</FONT></A><BR>　　<A href="http://mobilityworld.ericsson.com.cn/development/download_hit.asp" target=_blank><FONT color=#1d58d1>http://mobilityworld.ericsson.com.cn/development/download_hit.asp</FONT></A><BR><BR>　　·Motorola<BR><BR>　　Motorola提供了专门的SDK，内部包含模拟器，下载地址为：<BR><BR>　　<A href="http://www.motocoder.com/motorola/pcsHome.jsp" target=_blank><FONT color=#1d58d1>http://www.motocoder.com/motorola/pcsHome.jsp</FONT></A><BR><BR>　　·SamSung<BR><BR>　　SamSung也提供了专门的SDK和模拟器，下载地址为：<BR><BR>　　<A href="http://developer.samsungmobile.com/eng/front_zone/bbs/bbs_main.jsp?p_menu_id=1500" target=_blank><FONT color=#1d58d1>http://developer.samsungmobile.com/eng/front_zone/bbs/bbs_main.jsp?p_menu_id=1500</FONT></A><BR><BR>　　·NEC：<BR><BR>　　NEC也提供了集成模拟器的SDK，下载地址为：<BR><BR>　　<A href="http://www.nec-mfriend.com/cn" target=_blank><FONT color=#1d58d1>http://www.nec-mfriend.com/cn</FONT></A><BR><BR>　　2、厂商SDK和WTK有什么不同？<BR><BR>　　厂商SDK最简单的理解就是在WTK的基础上增加了自己的模拟器和自己的扩展API。也就是说，你在使用厂商的SDK时，可以使用厂商的扩展类库，例如Nokia的UI类库，和厂商自己的模拟器而已。每个厂商的扩展API都不多，而且不尽相同。<BR><BR>　　3、如何使用？<BR><BR>　　有些厂商SDK的使用都和WTK相同，例如SamSung。Nokia提供了独立的界面来开发，但是这个界面在实际开发中使用不多。<BR><BR>　　4、厂商SDK的问题<BR><BR>　　厂商SDK实现过程中，有一些bug，而且和真机实现不一致。例如NOKIA的混音播放问题等等。<BR><BR>　　八、在J2ME中获得手机IMEI的方法<BR><BR>　　IMEI是Internation mobile entity identification的简称，在手机中输入*#06#可以显示该数字，长度为15位，全球唯一，永远不会冲突，所以可以作为识别用户的一个标志。<BR><BR>　　下面是在J2ME中获得IMEI的方法：<BR><BR>　　1、<A class=bluekey href="http://www.yesky.com/key/4686/169686.html" target=_blank><FONT color=#1d58d1>MOTO</FONT></A>系列的手机可以通过读取系统的IMEI属性获得，代码如下：<BR><BR>　　 String imei = System.getProperty("IMEI");<BR><BR>　　2、SIEMENS系列的手机可以通过读取系统的com.siemens.IMEI属性获得，代码如下：<BR><BR>　　 String imei = System.getProperty("com.siemens.IMEI");<BR><BR>　　九、J2ME网络连接中显示问题的解决办法<BR><BR>　　在网络编程中，有些时候会出现一些在没有接收到网络数据就显示界面的，造成界面显示不符合要求（例如<A class=bluekey href="http://www.yesky.com/key/2152/172152.html" target=_blank><FONT color=#1d58d1>公告</FONT></A>显示，会先显示公告的背景图片再显示公告信息），这里提一个简单的解决办法给大家：<BR><BR>　　解决这种情况的方法分成三个步骤：<BR><BR>　　1、在需要显示的界面中，调用发送网络数据的方法。每次显示时调用该构造方法，不调用Display的setCurrent方法显示。<BR><BR>　　2、显示等待界面(例如进度条等)，给用户提示，在进行网络连接。<BR><BR>　　3、在处理网络反馈的数据完以后，调用Display的setCurrent方法显示显示当前界面。<BR><img src ="http://www.blogjava.net/jiansong/aggbug/29529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-02-04 14:28 <a href="http://www.blogjava.net/jiansong/articles/29529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>采用 Marv The Miner 的 J2ME MIDP 设备破碎教程（转载） </title><link>http://www.blogjava.net/jiansong/articles/29530.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 04 Feb 2006 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/29530.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/29530.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/29530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/29530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/29530.html</trackback:ping><description><![CDATA[<DIV class=postbody>
<UL>
<LI>如何将现有分段的 MIDP 项目移植到 NetBeans 
<LI>如何使用 IDE 的内置设备破碎解决方案 </LI></UL>
<P>本教程使用的示例程序是流行的 J2ME 游戏 "Marv The Miner"，这是在 GPL 下发布的程序，并且编写为在几个不同的移动平台上运行。 </P>
<P><A name=top></A>完成本教程大约需要两个小时的时间，并且包括以下主题：</P>
<UL>
<LI>从现有 MIDP 项目导入源。 
<LI>创建和定制每个分发 Jar 的项目配置。 
<LI>标记特定于每个配置的源代码段。 
<LI>为项目生成几个分发 Jar。 
<LI>通过 IDE 使用外部仿真器。 </LI></UL>
<P>要完成本教程，您需要 <TT><A href="http://www.digiment.no/main.jsp?category=downloads%82%22=2"><STRONG><FONT color=#045491>MarvTheMiner_120_all.zip</FONT></STRONG></A></TT> 文件，该文件包含此程序的原始源文件。单击<A href="http://www.digiment.no/main.jsp?category=downloads&amp;sub=2"><STRONG><FONT color=#045491>此处</FONT></STRONG></A>，下载“Marv the Miner v1.2.0（包括级别编辑器）”，以获得源文件。 </P>
<OL>
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#genericsetup"><STRONG><FONT color=#045491>设置环境</FONT></STRONG></A> 
<UL>
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#requirements"><STRONG><FONT color=#045491>获取并安装所需软件</FONT></STRONG></A> 
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#startide"><STRONG><FONT color=#045491>启动 IDE</FONT></STRONG></A> </LI></UL>
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#unzip"><STRONG><FONT color=#045491>获取所需源文件</FONT></STRONG></A> 
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#create"><STRONG><FONT color=#045491>在 NetBeans 中开发 Marv The Miner 应用程序</FONT></STRONG></A> 
<UL>
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#importsources"><STRONG><FONT color=#045491>导入现有源</FONT></STRONG></A> 
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#createconfigs"><STRONG><FONT color=#045491>创建项目配置</FONT></STRONG></A> 
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#customizeconfigs"><STRONG><FONT color=#045491>针对配置定制项目设置</FONT></STRONG></A> 
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#codeblocks"><STRONG><FONT color=#045491>为每个配置创建定制代码块</FONT></STRONG></A> </LI></UL>
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#execute"><STRONG><FONT color=#045491>生成和执行 Marv the Miner 应用程序</FONT></STRONG></A> 
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#explore"><STRONG><FONT color=#045491>深入探讨配置</FONT></STRONG></A> 
<LI><A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#nonuei"><STRONG><FONT color=#045491>使用不符合 UEI 的仿真器平台</FONT></STRONG></A> </LI></OL>
<H2><A name=genericsetup></A>设置环境</H2>
<P>此节介绍如何在开始本教程之前对系统进行设置。 </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="15%"><STRONG><A name=requirements></A>获取并安装所需软件 </STRONG></TD>
<TD vAlign=top>
<P>示例所需的软件如下：</P>
<UL>
<LI>带有 NetBeans Mobility Pack 4.0 或 FCS 的 NetBeans™ 集成开发环境 (IDE)。<BR>您可以从 NetBeans 下载站点获得此软件：<A onclick="window.open('http://www.netbeans.org/downloads/index.html')" href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#requirements"><STRONG><FONT color=#045491>http://www.netbeans.org/downloads/index.html</FONT></STRONG></A> 
<LI>Java™ 2 软件开发工具包标准版 (J2SE™ SDK), v. 1.4.2 或更高版本<BR>您可以从以下站点获得 J2SE SDK：<A onclick="window.open('http://java.sun.com/j2se/downloads.html')" href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#requirements"><STRONG><FONT color=#045491>http://java.sun.com/j2se/downloads.html</FONT></STRONG></A> 
<LI>J2ME™ Wireless Toolkit 2.0 或更高版本<BR>J2ME Wireless Toolkit 随 NetBeans Mobility Pack 一起安装。您还可以从以下站点获得 Wireless Toolkit：<A onclick="window.open('http://java.sun.com/products/j2mewtooklit/index.html')" href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#requirements"><STRONG><FONT color=#045491>http://java.sun.com/products/j2mewtooklit/index.html</FONT></STRONG></A>。 
<LI>用于 Symbian OS 的 Nokia Series 60 SDK<BR>可以从以下站点获得：<A onclick="window.open('http://www.forum.nokia.com/main/0,6566,034-483,00.html')" href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#requirements"><STRONG><FONT color=#045491>http://www.forum.nokia.com/main/0,6566,034-483,00.html</FONT></STRONG></A> 
<LI>SDK 可用于以下一种或多种产品：Nokia Series 40、Nokia Series 80、Nokia Series 90、Motorola SDK4.1 for J2ME GA、Vodafone 
<UL>
<LI>您可以从以下站点获得 Motorola SDK4.1 for J2ME GA：<A onclick="window.open('http://www.motocoder.com/motorola/pcsHome.jsp?node_name=SDK')" href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#requirements"><STRONG><FONT color=#045491>http://www.motocoder.com/motorola/pcsHome.jsp?node_name=SDK</FONT></STRONG></A>（需要注册） 
<LI>您可以从以下站点获得 Nokia SDK：<A onclick="window.open('http://www.forum.nokia.com/main/1,6566,030,00.html')" href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#requirements"><STRONG><FONT color=#045491>http://www.forum.nokia.com/main/1,6566,030,00.html</FONT></STRONG></A>。在“按技术领域查看工具”下拉框中选择 Java。 
<LI>Vodafone SDK 只可用于全球合作伙伴，不能通过简单的联机注册获得。 </LI></UL></LI></UL>
<P>使用下载站点提供的说明安装该软件。</P>
<OL>
<UL></UL></OL></TD></TR>
<TR>
<TD vAlign=top><STRONG><A name=startide></A>启动 IDE</STRONG></TD>
<TD vAlign=top>
<P>要启动 NetBeans IDE，请执行以下操作：</P>
<OL>
<UL>
<LI><B>在 Microsoft Windows 上<BR></B>选择“开始”&gt;“程序”&gt;“NetBeans<I>版本</I>”&gt; "NetBeans IDE"。 
<LI><B>在 UNIX 或 Linux 环境上<BR></B>在终端窗口中，键入 <TT>sh </TT><TT><I>IDE-install-path</I>/bin/runide.sh</TT> </LI></UL></OL>
<P><I><TT>IDE-install-path</TT></I> 变量代表 IDE 起始目录的路径。</P></TD></TR>
<TR>
<TD vAlign=top><A name=unzip></A><STRONG>获取所需源文件</STRONG></TD>
<TD vAlign=top>
<P><TT><A href="http://www.digiment.no/main.jsp?category=downloads&amp;sub=2"><STRONG><FONT color=#045491>MarvTheMiner_120_all.zip</FONT></STRONG></A></TT> 文件包含原始 Marv The Miner 应用程序的源文件。该 zip 包括一个 <TT>MarvTheMiner</TT> 目录，其中包含您将在本教程中使用的 <TT>src</TT> 和 <TT>res</TT> 子目录。</P>
<P>要解压缩 <TT><A href="http://www.digiment.no/main.jsp?category=downloads&amp;sub=2"><STRONG><FONT color=#045491>MarvTheMiner_120_all.zip</FONT></STRONG></A></TT> 文件，请执行以下操作： </P>
<OL>
<LI>在您的文件系统中，创建一个临时位置，用于放置 <TT>MarvTheMiner_120_all.zip</TT> 的内容。<BR>例如，在本教程中，该目录指的是 <TT>C:\temp</TT> 目录。 
<LI>使用用于解压缩文件的应用程序将 <TT>MarvTheMiner_120_all.zip</TT> 文件解压缩到 <TT>temp</TT> 目录。<BR><TT>temp</TT> 目录现在拥有 <TT>MarvTheMiner</TT> 目录，其中包含以下文件和子目录： 
<TABLE width="75%" border=0>
<TBODY>
<TR>
<TH>
<DIV align=left><B>文件或子目录</B></DIV></TH>
<TH>
<DIV align=left><B>描述</B></DIV></TR>
<TR>
<TH vAlign=top align=left><TT>src</TT></TH>
<TD>构成 Marv The Miner 程序的源文件。</TD></TR>
<TR>
<TH vAlign=top align=left><TT>res</TT></TH>
<TD>包含该程序所使用的资源文件。其中包括图，以及用于定义游戏级别布局的 .map 文件。</TD></TR>
<TR>
<TH vAlign=top align=left><TT>MarvEditor</TT></TH>
<TD>级别编辑器（不在本教程的讨论范围之内）。</TD></TR>
<TR>
<TH vAlign=top align=left><TT>Nokia.full</TT></TH>
<TD>该游戏的 Nokia 生成形式。</TD></TR>
<TR>
<TH vAlign=top align=left><TT>MIDP.full</TT></TH>
<TD>该游戏的一般 MIDP 生成形式。</TD></TR></TBODY></TABLE><BR>
<LI>将 res 目录移动到 <TT>C:/temp/MarvTheMiner_120_all/src/</TT>。为了在创建新的 NetBeans 项目之后确保资源文件保持正确的相对路径，可以使用这种简单的解决方法。 </LI></OL></TD></TR></TBODY></TABLE>
<H2><A name=create></A>在 NetBeans IDE 中开发 Marv The Miner 应用程序 </H2>
<P>本节介绍如何在 NetBeans IDE 中设置和使用现有项目源。</P>
<H3><A name=importsources></A>导入现有源</H3>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="15%"><B>创建项目</B></TD>
<TD vAlign=top>
<P>第一步是在 NetBeans IDE 中创建一个新项目。</P>
<OL>
<LI>从主菜单中选择“文件”&gt;“新建项目”。<BR>将显示“新建项目”向导。 
<LI>在“类别”列表中选择“移动”。然后选择“来自现有 MIDP 源的移动项目”，并单击“下一步”。 
<LI>如果未使用安装程序安装 NetBeans，则此处将显示一个面板，指导您安装移动平台。按照说明执行操作，并安装某些版本的 Wireless Toolkit。然后单击“下一步”。 
<LI>对于“导入的源的位置”，单击“浏览”按钮并导航至您在<A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#unzip"><STRONG><FONT color=#045491>解压缩</FONT></STRONG></A> MarvTheMiner_120_all.zip 文件时创建的 <TT>C:/temp/MarvTheMiner_120_all/src</TT> 目录。选择 <TT>src</TT> 目录，然后单击“打开”。单击“下一步”。 
<LI>输入新项目的名称。例如，将其命名为 <TT>MarvTheMiner</TT>。 
<LI>现在，选择新项目目录所在的目录。确保已选中“设置为主项目”复选框，并单击“完成”。<BR>将创建新项目 <TT>MarvTheMiner</TT>，并且显示在 IDE 的“项目”标签中。 
<LI>展开 MarvTheMiner 根项目节点，以查看该项目的源和资源。展开 &lt;缺省包&gt; 节点，然后双击 <TT>Main.java</TT>，以在编辑器中打开该文件。 </LI></OL></TD></TR></TBODY></TABLE>
<P><A href="http://www.netbeans.org/images/articles/marvtheminer/mainjava_zh_CN.png"><IMG src="http://www.netbeans.org/images/articles/marvtheminer/mainjava_zh_CN.png" width=600></A></P>
<H3><A name=createconfigs></A>创建项目配置 </H3>
<P>NetBeans 设备破碎解决方案基于对<EM>项目配置</EM>的使用。对于一个项目而言，为该项目创建的每个分发 Jar/Jad 都应该拥有一个项目配置。 </P>
<P>如果您检查文件 <CODE>Main.java</CODE>，将看到作者支持具有（Nokia 的 FullCanvas）和 <CODE>Class.forname()</CODE> 注释组合的多个平台。同时还定义了变量 <TT>vendor</TT>，该变量用于跟踪运行应用程序的电话。根据此信息，您可以看到他们支持五组不同的电话： </P>
<UL>
<LI>Nokia Series 60 
<LI>其他 Nokia 产品 
<LI>Motorola 
<LI>Vodafone 
<LI>其他 </LI></UL>
<P>同样，您将创建四个配置来处理这些分发之间的差异。</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="15%"><B>创建配置</B></TD>
<TD vAlign=top>
<OL>
<LI>右键单击 MarvTheMiner 项目节点，并选择“属性”。<BR>此时将打开“项目属性”页面，用于控制项目多方面的内容。 
<LI>单击该页顶部的“管理配置”按钮。此时将打开“管理配置”对话框。 
<LI>单击“添加”，然后键入 <CODE>NokiaSeries60</CODE> 并按“确定”。 
<LI>对于 <CODE>Motorola</CODE>、<CODE>Vodafone</CODE> 和 <CODE>NokiaOther</CODE> 重复前面的步骤。单击“关闭”可关闭“管理配置”对话框。 </LI></OL>
<P><IMG height=381 src="http://www.netbeans.org/images/articles/marvtheminer/platformconfig_zh_CN.png" width=456></P>
<P>位于“项目属性”页顶部的“项目配置”组合框现在应该包含五种配置。我们马上会使用这些设置，但是现在要向 IDE 添加一些仿真器。</P></TD>
<TR>
<TD vAlign=top><STRONG><A name=addemulators></A>向 IDE 添加仿真器 </STRONG></TD>
<TD vAlign=top>
<P>要使用已经安装在计算机上的仿真器平台运行项目，首先必须在 IDE 中进行注册。</P>
<OL>
<LI>在“项目配置”组合框中选择 "DefaultConfiguration"，然后选择“平台”节点。单击“管理仿真器”按钮。将出现“平台管理器”对话框。 
<P>请注意，还可以从“工具”&gt;“Java 平台管理器”的主菜单访问该对话框。 </P>
<LI>单击“添加平台”，并导航至安装 Nokia Series 60 仿真器的目录。单击“下一步”。 
<LI>确保仿真器设置检测正确，然后单击“下一步”。 
<LI>如果需要，在此您可以指向该仿真器的源文件和 javadoc 文件。否则，只需单击“完成”，以完成该平台的安装。 
<LI>
<P>对于您的机器上已经安装的每个仿真器平台，以及要通过 IDE 使用的每个仿真器平台重复这些步骤。</P><A href="http://www.netbeans.org/images/articles/marvtheminer/platformmanager_zh_CN.png"><IMG src="http://www.netbeans.org/images/articles/marvtheminer/platformmanager_zh_CN.png" width=600></A> 
<P>请注意，IDE 只能检测到符合 UEI 标准的仿真器。遗憾的是，这意味着不能检测开发人员用于 Marv The Miner 的 Motorola 7.5 仿真器。本教程<A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#nonuei"><STRONG><FONT color=#045491>后面的章节</FONT></STRONG></A>将介绍通过 IDE 使用不符合 UEI 的仿真器的解决办法。 </P></LI></OL></TD>
<TR>
<TD vAlign=top><STRONG><A name=customizeconfigs></A>针对配置定制项目设置 </STRONG></TD>
<TD vAlign=top>
<P>可以针对每个项目配置单独定制“项目属性”页上的每个面板。缺省情况下，配置将使用在缺省配置中定义的设置。 </P>
<OL>
<LI>打开“项目属性”页，并选择“平台”面板。确保在“项目配置”组合框中选中 "DefaultConfiguration"。 
<LI>在“仿真器平台”组合框中选择 "J2ME Wireless Toolkit 2.x"。将单选按钮切换为 CLDC-1.0 和 MIDP-2.0。<BR>缺省情况下，所有配置将使用此仿真器来生成和执行项目。然而，这并不是我们想要的结果，因为代码引用几个特定于平台的库。 
<LI>从“项目配置”组合框中选择 NokiaSeries60 配置。<BR>“平台”面板现在完全灰显。这是因为当前对此面板使用 "DefaultConfiguration" 中的值。 
<LI>取消选中该面板顶部的“使用 "DefaultConfiguration" 中的值”复选框。<BR>该面板中的所有元素现在将处于启用状态。从“仿真器平台”组合框中选择 Series 60 MIDP Concept SKD Beta 0.3.1 Nokia 平台。 
<P>如果在各个配置之间进行切换，您将看到，现在除了 NokiaSeries60 配置之外，所有配置都使用在 DefaultConfiguration 中指定的值。如果您更改了“DefaultConfiguration 平台”面板中的任何配置设置，所做的更改将传播到除 NokiaSeries60 之外的所有配置。</P>
<LI>在“项目配置”组合框中选择 "NokiaOther" 配置。取消选中“使用 "DefaultConfiguration" 中的值”复选框，并选择一个您安装的其他 Nokia 平台。 
<LI>也可以针对 Vodafone 平台重复这些步骤。 
<LI>如上所述，Motorola 7.5 仿真器不符合 UEI，因此不能安装到 IDE 中。然而，为了进行编译，我们仍然可以指向其 API。激活 Motorla 配置，并选择“库和资源”面板。 
<LI>取消选中“使用 "DefaultConfiguration" 中的值”复选框。 
<LI>单击“添加 Jar/Zip”，并导航至 <CODE>{motorola 安装目录}\Emulator7.5\lib</CODE>。选中每个 <CODE>.zip</CODE> 文件（使用 Ctrl+ 鼠标），然后单击“打开”。 
<LI>单击“确定”退出项目属性。现在您已经完成项目配置的创建任务。 </LI></OL></TD>
<TR>
<TD vAlign=top><STRONG><A name=codeblocks></A>为每个配置创建定制代码块 </STRONG></TD>
<TD vAlign=top>
<P>设备破碎解决方案的第二部分是能够指定源文件中的某些代码块，以使其特定于一个或多个配置。通过使用右键单击编辑器上下文菜单中的操作或通过“编辑”&gt;“预处理程序块”菜单可以完成此任务。</P>
<OL>
<LI>打开 <TT>Main.java</TT>，并检查 <TT>initStaticData()</TT> 方法。此处，该方法确定在运行时中哪些特定于设备的 API 可用，并随后执行相应的操作。这是一个非常智能的解决方案，可以解决设备破碎某些部分的问题。遗憾的是，该解决方案也存在会添加分发 Jar 的大小，从而影响运行时性能及提高源复杂性的问题，并且不能解决所有分段问题（您随后会看到这一点）。 
<P>以下是 <CODE>initStaticData()</CODE> 的相关部分： </P><PRE class=examplecode>vendor = 0;
try
   {
// Nokia
Class.forName("com.nokia.mid.sound.Sound");
vendor = 1;
try
       {
Class.forName("com.nokia.mid.ui.DeviceControl");
com.nokia.mid.ui.DeviceControl.setLights(0,100);
vendor = 2;
       }
catch(Exception ex2){}
   }
catch(Exception ex){}

try
   {
// Vodafone
Class.forName("com.vodafone.v10.system.device.DeviceControl");
com.vodafone.v10.system.device.DeviceControl.getDefaultDeviceControl().
setDeviceActive(com.vodafone.v10.system.device.DeviceControl.BACK_LIGHT,
true);
vendor = 3;
   }
catch(Exception ex){}

try
   {
// Motorola
Class.forName("com.motorola.multimedia.Vibrator");
Class.forName("com.motorola.multimedia.Lighting");
com.motorola.multimedia.Lighting.backlightOn();
vendor = 4;
   }
catch(Exception ex){}
                    </PRE>
<LI>删除所有只涉及确定程序在哪个设备上运行的功能，因此剩下的代码如下： <PRE class=examplecode> // Nokia
com.nokia.mid.ui.DeviceControl.setLights(0,100);

// Vodafone
com.vodafone.v10.system.device.DeviceControl.
	getDefaultDeviceControl().
	setDeviceActive(com.vodafone.v10.system.device.DeviceControl.BACK_LIGHT,
			true);

// Motorola
com.motorola.multimedia.Lighting.backlightOn();
                    </PRE>
<P>现在您拥有与不同配置关联的三个代码块。 </P>
<LI>突出显示特定于 Motorola 的行，然后右键单击编辑器，并选择“预处理程序块”&gt; "Motorola"。 
<LI>对于 Vodafone 块重复此步骤（“预处理程序块”&gt; "Vodafone"）。 
<LI>对于 Nokia 代码，选择“预处理程序块”&gt;“管理预处理程序块”。<BR>此时将打开“管理预处理程序块”对话框。 
<LI>选择 "NokiaOther" 和 "NokiaSeries60" 的选项，然后单击“确定”。 
<P>这些代码块现在与预处理程序块的页眉和页脚中列出的配置相关联。如果活动配置是预处理程序块页眉和页脚的一部分，则更改项目的活动配置将触发一个预处理程序，该程序将注释或注释掉所基于的块。</P>
<P><A href="http://www.netbeans.org/images/articles/marvtheminer/editorconfiguration.png"><IMG src="http://www.netbeans.org/images/articles/marvtheminer/editorconfiguration.png" width=600></A></P>
<LI>&nbsp;通过使用主工具栏中的组合框可更改项目的活动配置。<BR>还可以通过从主“生成”菜单中的相同菜单右键单击项目节点 &gt;“设置活动项目配置”&gt; 选择配置，或通过切换主工具栏中的“配置”组合框（如果项目当前是主项目）来完成此操作。<BR><BR>请注意，代码块突出显示的颜色将发生变化，以标识哪些块处于活动状态，哪些块处于非活动状态。活动配置名称也将在代码块的页眉/页脚中突出显示一个不同的颜色。 <BR>
<LI>从 <CODE>beep()</CODE> 方法中删除 <TT>class.forName()</TT> 的所有实例。如果还要精简 if 块，则剩下以下代码： <PRE class=examplecode>if (midlet.muteSound == 0)
{
// Nokia 3650, 7650
com.nokia.mid.sound.Sound sound = new com.nokia.mid.sound.Sound(1000,100);
sound.play(1);
// All other Nokias
com.nokia.mid.sound.Sound sound = new com.nokia.mid.sound.Sound(1000,100);
sound.play(1);

}

if (midlet.useVibra == 1)
{
// Nokia
com.nokia.mid.ui.DeviceControl.startVibra(50,500);
// Vodafone SDK
com.vodafone.v10.system.device.DeviceControl.
	getDefaultDeviceControl().
		setDeviceActive(
			com.vodafone.v10.system.device.DeviceControl.VIBRATION,
			true);
vibra_delay = 10;

// Motorola 7.5
com.motorola.multimedia.Vibrator.
	setVibrateTone(
		com.motorola.multimedia.Vibrator.VIBRATE_LONG);
com.motorola.multimedia.Vibrator.vibrateFor(500);

}
</PRE>
<P>您应该能够将每个块与正确配置相关联。切记将 Nokia 振动控制调用与两个 Nokia 配置相关联。</P>
<LI><TT>run()</TT> 方法也包含特定于 Vodafone 的调用。删除 try/catch 块，并将这两行与 Vodafone 配置相关联。 <BR>
<P>我们马上就能完成任务了。最后一步是以某种方式来处理 Nokia 的 <TT>FullCanvas</TT>。 </P>
<LI>激活 NokiaSeries60 配置。 
<LI>右键单击 FullCanvas 声明，并选择“创建 If/Else 程序块”(NokiaSeries60)。 
<LI>右键单击第一个块，并添加 NokiaOther。 
<LI>右键单击第二个块，并添加 NokiaOther。 
<LI>第二个块是倒置的块。将此倒置的块类定义更改为 <TT>extend Canvas</TT>。 </LI></OL>
<P>完成后，类定义如下： 
<P><A href="http://www.netbeans.org/images/articles/marvtheminer/classdef.png"><IMG src="http://www.netbeans.org/images/articles/marvtheminer/classdef.png" width=600></A> </P></TD></TR></TBODY></TABLE>
<H2><A name=execute></A>生成和执行 Marv the Miner 应用程序</H2>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="15%"><STRONG><A name=requirements></A>生成和执行应用程序</STRONG></TD>
<TD vAlign=top>
<P>此时，我们应该能够针对所有配置编译和运行该程序。单击主工具栏上的任何图标将对活动配置执行所选的操作。 </P>
<OL>
<LI>在主菜单中，选择“生成”&gt;“生成所有主项目配置”。<BR>假设所有项目均已正确设置，现在应该可以生成所有配置了。 
<P>如果您不能访问包含正确 API 的一个或多个仿真器平台，则此步骤可能失败。如果出现这种情况，您应该手动注释掉任何对不存在的 API 进行的调用。 </P>
<P>如果您未按照这些步骤手动安装<A href="http://www.netbeans.org/kb/articles/tutorial-j2mefragmentation-40_zh_CN.html#nonuei"><STRONG><FONT color=#045491>不符合 UEI 的仿真器一节</FONT></STRONG></A>中描述的 Motorola 仿真器，则针对 Motorola 配置的预校验将失败。为了在不手动添加仿真器的情况下进行此配置的编译，您可以注释掉所有 motorola API 调用，并从“库和资源”面板中删除 motorola 库。</P>
<LI>选择 IDE 左上方的“文件”标签，并展开 <TT>dist</TT> 文件夹。在此文件夹中，您应该拥有包含每个已成功生成配置的 Jar/JAD 的目录，以及代表 DefaultConfiguration 生成的 Jar/Jad。 
<LI>按 F5 可采用当前选定的配置运行该程序。您可以切换配置，并再次按 F5，同时运行该程序的多个版本。 </LI></OL>
<OL>
<UL></UL></OL></TD></TR></TBODY></TABLE>
<H2><A name=explore></A>5. 深入探讨配置</H2>
<P>通过本教程，您可以熟练掌握如何将现有 MIDP 项目导入到 NetBeans 环境中，但是它并未将 IDE 解决的所有设备破碎问题全部列出。以下列举了一些常见问题的更多示例及如何通过 IDE 来解决。 
<UL>
<LI>项目属性页中的每个面板都是特定于配置的（“一般”页除外）。从而为您提供了极大的灵活性。例如，对于每个配置唯一命名的（“创建 Jar”面板）分发 Jar，您可以拥有不同的 <TT>MIDlet-Version</TT> 值（“应用程序描述符”面板）。 
<LI>在设置项目之间的相关项时，特别是在使用“项目配置”时，应确保在“选择项目”对话框的“项目 Jar 文件”列表框中选择正确的输出 jar。将显示所选项目中每个配置的项目 Jar。 
<P></P>
<P>例如，您拥有两个项目 MyLibrary 和 MyApplication，这两个项目均包含两个配置 ReleaseConfiguration 和 DebugConfiguration，则可以执行以下步骤来设置正确的相关项：</P>
<UL>
<LI>打开 MyApplication 的“项目属性”。在“项目配置”组合框中选择 "ReleaseConfiguration"。 
<LI>选择“库和资源”面板，然后单击“添加项目”按钮。 
<LI>导航至 MyLibrary 项目的位置。“项目 Jar 文件”列表框现在包含三个项目 Jar。在路径 <TT>dist/ReleaseConfiguration/</TT> 中选择其中之一，然后单击“添加项目 Jar 文件” 
<LI>切换到 DebugConfiguration，并重复这些步骤，除非此时添加位于 <TT>dist/DebugConfiguration/</TT> 中的项目 jar。 </LI></UL>
<P>这是在进行配置时设置项目之间相关项所采用的方式。 </P>
<LI>该解决方案是 VCS 友好型的。所有源文件将始终保存到硬盘驱动器上，就好像已选中 DefaultConfiguration 一样。从而可以防止在 VCS 检入期间发生冲突，或由于拥有不同的活动配置而导致更新。还要确保共享 project.properties 文件（位于 <TT>{projecthome}/nbproject</TT>）！ 
<LI>可以通过命令行来运行项目，而不用使用 IDE。只需在项目起始目录中键入 <TT>ant run</TT>，项目就会使用活动配置运行。通过键入 <TT>ant run -Dconfig.active={config_name}</TT>，您可以将不同的配置传递到 ant 脚本 
<LI>使用现有预处理程序解决方案的项目应该易于导入。虽然 NetBeans 预处理程序相比之下不太复杂，但是却可以使用提供的指令表达任何情况。 
<LI>使用“库和资源”面板或“过滤”面板可以决定应该将哪个版本的资源部署到分发 Jar。 
<UL>
<LI>库和资源：创建一个 Jar 文件的多个版本（该文件包含应用程序的所有资源），然后指向每个配置正确的 Jar 版本。因此您可能拥有 3 个 jar：<CODE>large_res.Jar</CODE>、<CODE>medium_res.Jar</CODE>、<CODE>small_res.Jar</CODE>，其中每个 Jar 文件都包含同名但解决方式不同的资源。然后指向正确版本的 Nokia_large、Nokia_med、Nokia_small 配置。 
<LI>过滤：包括直接位于 <TT>src</TT> 目录中或该目录之下的资源，然后使用“过滤”树来控制分发 Jar 中包含的资源版本。 </LI></UL></LI></UL>
<H2><A name=nonuei></A>使用不符合 UEI 的仿真器平台</H2>
<P>虽然 IDE 只能自动检测符合 UEI 规范的第三方仿真器平台，但是仍然可以使用不符合 UEI 的仿真器。本节介绍具体操作方式。</P>
<LI>
<TABLE cellSpacing=0 cellPadding=5 width="100%" border=0>
<TBODY>
<TR>
<TD vAlign=top width="15%"><B>添加不符合 UEI 的仿真器</B></TD>
<TD vAlign=top>
<OL>
<LI>在 userhome 目录中（在 Windows 中的缺省位置为 <TT>C:\Documents and Settings\{username}\.netbeans</TT>，Linux 中的缺省位置为 <TT>/home/{username}/.netbeans</TT>），检查 <TT>{userhome}\config\Services\Platforms\org-netbeans-api-java-Platform</TT> 目录。<BR>此目录包含定义已安装仿真器平台的 xml 文件。您可以为不符合 UEI 的任何仿真器手动创建这些文件。可以在以下网址找到此 xml 文件的 DTD：<A href="http://www.netbeans.org/dtds/j2me-platformdefinition-1_0.dtd"><STRONG><FONT color=#045491>http://www.netbeans.org/dtds/j2me-platformdefinition-1_0.dtd</FONT></STRONG></A> 
<LI>将以下文件保存为 <TT>SDK_4.1_MRI_7.5.xml</TT>，以使用本教程所需的 Motorola 7.5 仿真器。请注意，使用 <TT>&amp;quot;</TT> 是有一定作用的，应按原样保存。 <PRE class=examplecode>&lt;?xml version='1.0'?&gt;
&lt;!DOCTYPE platform PUBLIC '-//NetBeans//DTD J2ME PlatformDefinition 1.0//EN'
	'http://www.netbeans.org/dtds/j2me-platformdefinition-1_0.dtd'&gt;
&lt;platform name="Motorola_7_5"
home="C:\WTK\Motorola\SDK v4.1 for J2ME\Emulator7.5"
type="custom"
displayname="Motorola 7.5"
srcpath=""
preverifycmd="&amp;quot;{platformhome}/bin/preverify.exe&amp;quot;
	-classpath &amp;quot;{classpath}&amp;quot; -d &amp;quot;{destdir}&amp;quot;
	&amp;quot;{srcdir}&amp;quot;"
runcmd=""&gt;
&lt;device name="Motorola_7_5" securitydomains="trusted,untrusted"
	description="Motorola_7_5"&gt;
&lt;configuration name="CLDC" version="1.1" displayname="CLDC"
	classpath="${platform.home}/lib/cldc.zip"
	dependencies="" default="true"/&gt;
&lt;profile name="MIDP" version="2.0" displayname="MIDP"
	classpath=";${platform.home}/lib/midp.zip"
	dependencies="" default="true"/&gt;
&lt;/device&gt;
&lt;/platform&gt;
</PRE>
<P>保存此 XML 文件之后，需要重新启动 IDE。完成操作之后，就可以选择 Motorola 7 5 作为平台，而选择 Motorola_7_5 作为设备。您应该将 Motorola 配置与这个新的平台相关联。请注意，您可能需要删除 {userhome}\var\cache 中的缓存文件，以便检测到手动安装的平台。此外，不应删除也可能位于此处的 mdrstorage 文件夹。 </P>
<P>注意 <TT>runcmd</TT> 特性设置为空字符串。这是因为启动此 Motorola 仿真器的命令将 MIDlet 作为其参数之一来执行。这与 UEI 标准截然不同，IDE 中不能提供直接支持。但是...</P>
<LI>
<UL></UL>如果您所使用的仿真器平台所需的信息不会比提供给 UEI 仿真器的信息要多，则可以跳过此步骤。以下信息将提供给 UEI 仿真器： 
<UL>
<LI>安全域 
<LI>平台类型 
<LI>平台起始目录 
<LI>Jad 位置 
<LI>Jad 目标目录/Jad 名称 </LI></UL></LI></OL>
<P>如果您的仿真器需要额外信息（如项目 Jar 的位置或要执行的 MIDlet 的名称），则通过修改位于项目起始目录中的 <TT>build.xml</TT> 文件可以执行仿真器。 </P>
<P>此文件控制所有项目操作。我们在此可以创建一个新目标，该目标不仅可以执行 motorola 仿真器，如果在 Motorola 配置上调用运行操作，则还可以传递所有适当的数据。</P>
<P>向项目的 <TT>build.xml</TT> 添加以下代码：</P><PRE class=examplecode>&lt;target description="Run MIDlet suite." depends="init" name="run"&gt;
&lt;condition property="run.motorola"&gt;
&lt;!-- arg2 must match the configuration name
    you would like to use the special emulator --&gt;
&lt;equals arg1="${config.active}" arg2="Motorola"/&gt;
&lt;/condition&gt;
&lt;ant inheritrefs="true" inheritall="true" target="run_normal"/&gt;

&lt;ant inheritrefs="true" inheritall="true" target="run_motorola"/&gt;

&lt;/target&gt;

&lt;target description="Run MIDlet suite the normal way." depends="init"
	name="run_normal" unless="run.motorola"&gt;

	&lt;nb-run commandline="${platform.runcommandline}"
	securitydomain="${evaluated.run.security.domain}"
	execmethod="${run.method}" platformtype="${platform.type}"
	platformhome="${platform.home}" device="${platform.device}"
	jadurl="${dist.jad.url}" jadfile="${dist.dir}/${dist.jad}"/&gt;
&lt;/target&gt;

&lt;target description="Run MIDlet suite for motorola's non-UEI emulator."
	depends="init" name="run_motorola" if="run.motorola"&gt;
&lt;property name="project.home" location="."/&gt;

&lt;!-- the last arg line contains an value "Miner".
    This must match the name of the midlet you want to execute  --&gt;
&lt;java dir="${platform.home}/bin"
fork="true"
classname="com.mot.tools.j2me.emulator.Emulator"
classpath="${platform.home}/bin/Emulator.jar;${platform.home}/bin/configtool.jar"&gt;
&lt;jvmarg value="-Djava.library.path=${platform.home}/lib"/&gt;
&lt;arg value="-classpath${project.home}/${dist.dir}/${dist.jar}"/&gt;
&lt;arg line="-deviceFile"/&gt;
&lt;arg value="${platform.home}/bin/RESOUR~1/T720I~1.PRO"/&gt;
&lt;arg line="javax.microedition.midlet.AppManager Miner -JSA 1 1"/&gt;
&lt;/java&gt;

&lt;/target&gt;

</PRE>
<P>因此，只要活动配置是 <TT>Motorola</TT>，就会运行 <CODE>run_motorola</CODE> 目标。否则，将调用 <CODE>run_normal</CODE> 目标（使用正常仿真器执行程序）。 </P></TD></TR></TBODY></TABLE>
<P>其中包括 Marv the Miner 教程。</P><!-- End Content Area -->
<DIV></DIV></LI></DIV><img src ="http://www.blogjava.net/jiansong/aggbug/29530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-02-04 14:28 <a href="http://www.blogjava.net/jiansong/articles/29530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Java 编写手机应用程序 Motorola iDEN篇（转载）</title><link>http://www.blogjava.net/jiansong/articles/29527.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 04 Feb 2006 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/29527.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/29527.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/29527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/29527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/29527.html</trackback:ping><description><![CDATA[<DIV class=postbody>█前言 <BR><BR>本文内容的所有操作皆在Windows 200操作系统上经过测试。如果您在不同的平台上验证本文内容，例如Windows 98或是Windows Me，则我们无法保证会有相同的结果。 <BR><BR>█简介 <BR><BR>不知从什幺时候开始，我们突然感觉到周围的人各各拥有一只手机。利用手机与别人沟通成了我们生活的一部份。北欧某些先进国家的人民可以利用手机购买自动售货机所出售的商品;他们也可以在从事行动商务(m-commence) 交易时利用手机做为一种认证工具。在日本，行动电话的许多附加功能更是年轻人文化的一部分。即将来临的3G，无线宽频的美梦带给了人们对无线通讯未来的期待。 <BR><BR>然后，有些厂商开始行销它们自己生产的PDA，好象没有一台PDA在手，就不像现代人似的。各式各样的PDA充斥市面，畅销的与不畅销的，让人眼花撩乱。这时产生了一个大问题--要我们同时携带手机和PDA是一件很麻烦的事情-就算它们都还算轻薄短小。如果可以把手机和PDA合而为一岂不是更方便吗? 于是听到消费者心声的厂商，开始有推出手机和PDA合而为一的产品，从NOKIA 9000、Motorola A6188(太极)，到最近要推出的Ericsson R380、NOKIA 9210，都是手机与PDA结合的例子，虽然因为售价的关系，但是这些产品仍然是许多人梦寐以求的高阶产品。 <BR><BR>尽管有了PDA与手机结合的产品出现，我们仍然觉得有所不足，我想大家一定发现了，就是应用程序的不足，虽然手机和PDA 结合了，可是这些产品上的PDA功能看起来似乎是死的。我们可以任意在PalmOS、Windows CE、EPOC等PDA上使用C/C++或是Java编写这些平台上的应用程序，但是却从未有过机会将我们写好的程序下载到这些手机上执行(即使有些手机的PDA也是使用EPOC，如Ericsson R380)。 <BR><BR>相信厂商也听到我们这些喜欢到处写程序的工程师的心声了，所以从2000年年底开始，即将陆陆续续有许多支持Java的手机即将推出，当然，这些厂商也提供了在手机上开发程序的SDK，我们终于可以在手机上面写些小程序自娱了!这是以前等了很久的美梦。 <BR><BR>手机平台的多样性与复杂性，和PDA比较起来可以说是有过之而无不及，于是大家就可以知道 - 哈!又是Java派上用场的时候了。我们都知道在浏览器上执行的Java程序叫做Applet，在PalmOS上执行的Java程序叫做Spotlet，然而在手机上执行的应用程序我们称做MIDlet，相信对大家来说都是一个陌生的名词，这也就是本篇文章所要介绍的主角。 <BR><BR>支持Java的手机大厂目前已知有NOKIA (预计在2001年年初推出一款支持Java的手机NOKIA 9210)、Motorola(会先在支持integrated Digital enhanced network(iDen)网络的手机上支持Java，然后再推出支持Java的GSM手机，该公司的手机大致会在2002年前全部支持Java)以及NTT DoCoMo(将在明年第二季度左右推出支持Java的手机)。 <BR><BR>虽然这些大公司都准备支持Java，不过在决定编写本文时，只有Motorola将其SDK开放于网站上供程序开发者下载测试，所以本文内容都是根据Motorola J2ME SDK所编写。又由于这些手机市面上无法取得，所以我们的程序都是在SDK内附的模拟器中执行，相信最后这些手机上市时，我们所编写的MIDlet应该会很容易并成功地在Motorola的手机上执行才对。<BR><BR>█如何取得Motorola J2ME SDK <BR><BR>我们要做的第一件事情当然还是要先取得SDK罗!<BR>请直接到https://commerce.motorola.com/idenonline/ideveloper/下载Motorola J2ME SDK Drop 7。如果您不是iDEN® Developer的会员，请先在网络上注册(免费)。注册成功之后，Motorola会将密码寄到您的email信箱之中，然后使用该密码登入网页上的My Development Center。进入之后选择网页上头的TOOLS &amp; RESOURCES以进入可下载的开发工具的网页，请选择Motorola J2ME SDK Components Developer Edition， Drop 7.0下方的下载超连结以下载SDK，整个SDK的大小约为3 MB左右。 <BR><BR>请注意下载前的Download Page for Motorola J2ME™ SDK安装说明，里头会告诉你安装密码，请先行记下。稍后当您在您的电脑上安装Motorola J2ME SDK的时候，会询问您安装密码，所以请务必记下该密码。<BR><BR>█Motorola J2ME SDK的安装 <BR><BR>安装需求<BR>根据官方需求，安装Motorola J2ME SDK的基本配备为:<BR>Pentium 100 MHz微处理器<BR>64 MB RAM<BR>Windows NT WorkStation 4.0配合Service Pack 3 / Win98<BR>(本文是在Windows 2000 Professional中文版上测试)<BR>约6 MB的硬盘空间<BR>Java 2 SDK 1.2.2<BR>(本文使用Java 2 SDK 1.3.0_01作测试) <BR><BR>安装Motorola J2ME SDK<BR>要安装新版Motorola J2ME SDK之前，请先确认您已经将旧版的Motorola J2ME SDK完全删除。您可以由控制台里头的 「新增/删除程序」的功能删除旧版Motorola J2ME SDK。之后再将旧版Motorola J2ME SDK安装所在路径清除即可。<BR>解开您从Motorola网站上下载的ZIP文件，您会看到一个名为Motorola_SDK.exe的文件，双击此文件即可开始安装动作。请注意，在安装时系统会要求您输入密码，请输入之前所纪录的安装密码即可。 <BR><BR>█Motorola J2ME SDK目录结构<BR><BR>当您成功地安装Motorola J2ME SDK之后，其目录结构如下图:<BR><BR><BR><BR>█MIDlet程序结构<BR><BR>在手机上执行的程序我们统称MIDlet，其程序结构很简单，与大家熟悉的Applet结构有异曲同工之妙。<BR>每一个MIDlet程序都必须继承自javax.microedition.midlet.MIDlet类别，并实做三个函式，它们分别是:<BR><BR>protected void startApp()<BR>protected void pauseApp()<BR>protected void destroyApp(Boolean unconditional)<BR>而一个MIDlet程序的起始与结束之流程我们以下图来表示:<BR><BR>█编写并编译MIDlet<BR><BR>请先到您的Motorola J2ME SDK安装目录下的demo\midlets目录底下新建一个名为HelloMIDlet.java的文件，其内容为:<BR><BR>HelloMIDlet.java<BR>import javax.microedition.lcdui.*;<BR>import javax.microedition.midlet.*;<BR><BR>public class HelloMIDlet extends MIDlet <BR>{<BR>HelloMIDlet() <BR>{ <BR>}<BR><BR>protected void startApp() throws MIDletStateChangeException <BR>{<BR>}<BR><BR>protected void pauseApp() <BR>{<BR>}<BR><BR>protected void destroyApp(boolean unconditional)<BR>throws MIDletStateChangeException <BR>{<BR>}<BR>}<BR>在demo\midlets目录之中您会看到一个名为compileAll.bat的批处理文件，前面有提到，这个批处理文件除了可以帮助您编译所有内附范例程序之外，还可以简化您自己所编写的MIDlet之编译流程。<BR>请在命令列视窗输入: compileAll HelloMIDlet.java<BR>如果成功编译，屏幕上输出的结果如下图所示:<BR><BR><BR><BR><BR>从屏幕上的输出，您可以发现，要让MIDlet可以在手机上执行，大体上还是要经过两个动作(与Spotlet相似)，分别是编译(compiling)以及预先审核(Preverifying)。<BR>有关预先审核这个动作，笔者已经在RUN!PC 11月号的文章「利用Java 编写PalmOS应用程序基础篇」之中有向读者们提过，如果对这个方面有所疑问的朋友，请再将您的RUN!PC 11月号翻出来复习一下吧!<BR><BR>从这个简短的MIDlet制作流程里头，相信大家可以发现，比起纯粹用Sun的CLDC编写能在KVM上执行的Spotlet要简单上许多。原因是compileAll.bat这个批处理文件帮我们做掉大部分dirty work。<BR>那幺，如果您写好的程序并非放在demo\midlets目录之中，是否就无法编译了? 从compileAll.bat里头，我们可以发现它帮我们完成上述两项工作的指令。如果我们写好的程序放在demo\midlets目录以外的地方，您可以执行下面的指令，您仍然可以成功地制作MIDlet:<BR>(我们假设您的Motorola J2ME SDK安装在D:\MotoSDK目录之中，并将您自行编写的HelloMIDlet.java置于d:\jdk1.3.0_01\my目录之中。同时我们假设您在d:\jdk1.3.0_01\my目录底下执行下面指令。)<BR>编译: <BR><BR>javac -O -bootclasspath d:\MotoSDK\lib HelloMIDlet.java <BR>注意: -bootclasspath指向类函数库的所在位置。 <BR><BR>预先审核: <BR><BR>d:\MotoSDK\bin\preverifier -classpath d:\MotoSDK\lib;. -d . HelloMIDlet <BR>注意:<BR>1 . -classpath指向类函数库的所在位置，也要指向我们所编写的MIDlet所在的位置。<BR>2 .–d指向您希望预先编译类文件产生之后所放置的路径,如果写"."表示本目录，会覆盖掉原先未经过预先编译的类文件。如果您没有指定，则预设值为".\output"目录。 <BR><BR>当然，如果您嫌自己手动操作很麻烦，您可以将compileAll.bat复制到其它目录之中，并更改其编译指令与预先审核指令之中和类函数库有关的相关设定即可。<BR>提到compileAll.bat，顺便向各位读者说明一下，在前面有提到，compileAll.bat可以帮助您编译所有位于demo\midlets目录下的范例程序，您只要在命列列下直接输入: compileAll即可。compileAll.bat会自动当您编译的package有以下几项:<BR>com.mot.j2me.midlets.bounce<BR>com.mot.j2me.midlets.imagetests<BR>com.mot.j2me.midlets.paddleball<BR>com.mot.j2me.midlets.scribble<BR>com.mot.j2me.midlets.tests<BR>com.mot.j2me.midlets.tutorials<BR>如果您希望compileAll.bat自动帮您编译其它package底下的程序，请您开启compileAll.bat，修改其COMPILECLASS环境变数的设定即可。<BR><BR>█修改并执行MIDlet <BR><BR>写好程序之后，大家最希望的事情当然就是让它在手机上执行，不过由于目前大家无法取得Motorola这些支持Java的手机，所以我们只能在Motorola J2ME SDK内附的模拟器上执行我们写好的MIDlet。相信手机正式推出时，应该可以顺利地在手机上执行。底下笔者将告诉您如何使用Motorola J2ME SDK内附的模拟器来测试您所编写的MIDlet。<BR>在这之前，由于之前我们所编写的范例程序只是简单的MIDlet空壳，我们必须让它能够在模拟器上显示出一些信息才可以，因此请修改上一个程序范例，使它的内容如下:<BR>HelloMIDlet.java<BR>import javax.microedition.lcdui.*;<BR>import javax.microedition.midlet.*;<BR><BR>public class HelloMIDlet extends MIDlet <BR>{<BR>private Display firstDisplay ;<BR>private Form firstForm ;<BR>HelloMIDlet() <BR>{<BR>firstDisplay = Display.getDisplay(this) ;<BR>firstForm = new Form("Hello MIDlet") ;<BR>StringItem firstStrItem = new StringItem("Hello","MIDlet") ;<BR>firstForm.append(firstStrItem) ;<BR>}<BR><BR>protected void startApp() throws MIDletStateChangeException <BR>{<BR>firstDisplay.setCurrent(firstForm) ;<BR>}<BR><BR>protected void pauseApp() <BR>{<BR>}<BR><BR>protected void destroyApp(boolean unconditional)<BR>throws MIDletStateChangeException <BR>{ <BR>}<BR>}<BR>请将此文件放置在\demo\midlets目录下。编译完成之后，请将目录切换到scripts子目录之中，您会在此目录里发现一些写好的批处理文件。请在该目录下执行这些批处理文件指令以启动模拟器。执行的指令与执行结果如下所示:<BR><BR>指令: runEmul HelloMIDlet<BR>输出结果:<BR><BR><BR>指令: runMotoi1000 HelloMIDlet<BR>输出结果:<BR><BR><BR>指令: runMotoiDEN HelloMIDlet<BR>输出结果 :<BR><BR><BR>指令: runStarTac HelloMIDlet<BR>输出结果:<BR><BR><BR>指令: runMyDevice HelloMIDlet<BR>输出结果<BR>Error loading property file: C:/properties/mydevice.props (系统找不到指定的路径。)会出现错误信息是因为您没有指定属于是用者自订的手机外观的缘故，后面将会教您如何设定用户自订的手机外观。<BR><BR><BR><BR>如果我们将写好的程序放在demo\midlets目录以外的地方，您可以执行下面的指令，仍然可以成功地启动模拟器并执行MIDlet:<BR>(我们假设您的Motorola J2ME SDK安装在D:\MotoSDK目录之中，并将您自行编写的HelloMIDlet.java置于d:\jdk1.3.0_01\my目录之中。同时我们假设您在d:\jdk1.3.0_01\my目录底下执行下面指令。)<BR><BR>执行一般模拟器 java -Djava.library.path=d:\MotoSDK\lib <BR>-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator <BR><BR>-classpath.;d:\MotoSDK\lib javax.microedition.midlet.AppManager HelloMIDlet <BR><BR>-JSA 1 1 <BR><BR>请注意:<BR>第一个-classpath设定，-classpath与路径名称之间有空格。<BR>第二个-classpath设定，-classpath与路径名称之间没有空格。 <BR><BR><BR><BR>执行模拟器并套用i1000手机外观<BR>java -Djava.library.path=d:\MotoSDK\lib <BR>-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator <BR><BR>-classpath.;d:\MotoSDK\lib <BR>-deviceFile resources\Motorolai1000.props<BR>javax.microedition.midlet.AppManager <BR><BR>HelloMIDlet<BR>-JSA 1 1 <BR><BR>请注意:<BR>第一个-classpath设定，-classpath与路径名称之间有空格。<BR>第二个-classpath设定，-classpath与路径名称之间没有空格。 <BR><BR><BR><BR>执行模拟器并套用iDEN手机外观 java -Djava.library.path=d:\MotoSDK\lib <BR>-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator <BR><BR>-classpath.;d:\MotoSDK\lib <BR>-deviceFile resources\MotorolaiDENPlatform.props<BR>javax.microedition.midlet.AppManager <BR><BR>HelloMIDlet<BR>-JSA 1 1 <BR>请注意:<BR>第一个-classpath设定，-classpath与路径名称之间有空格。<BR>第二个-classpath设定，-classpath与路径名称之间没有空格。 <BR><BR><BR><BR>执行模拟器并套用StarTac手机外观 java -Djava.library.path=d:\MotoSDK\lib <BR>-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator <BR><BR>-classpath.;d:\MotoSDK\lib <BR>-deviceFile resources\StarTac.props<BR>javax.microedition.midlet.AppManager <BR><BR>HelloMIDlet<BR>-JSA 1 1 <BR>请注意:<BR>第一个-classpath设定，-classpath与路径名称之间有空格。<BR>第二个-classpath设定，-classpath与路径名称之间没有空格。 <BR><BR><BR><BR>执行模拟器并套用用户自订手机外观 java -Djava.library.path=d:\MotoSDK\lib <BR>-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator <BR><BR>-classpath.;d:\MotoSDK\lib <BR>-deviceFile &lt;您的props文件所在的绝对路径&gt;javax.microedition.midlet.AppManager <BR><BR>HelloMIDlet<BR>-JSA 1 1 <BR>请注意:<BR>第一个-classpath设定，-classpath与路径名称之间有空格。<BR>第二个-classpath设定，-classpath与路径名称之间没有空格。<BR>如果您将您的props文件放在d:\MotoSDK\bin的resources目录之下，则上述指令只要改成：-deviceFile resources\&lt;您的props文件名&gt; <BR><BR><BR><BR>注意，当您您直接使用上述指令启动模拟器，如果出现底下错误信息:<BR>Error loading property file: resources/defaultdevice.props (系统找不到指定的路径。)<BR>这是因为您没有将d:\MotoSDK\bin目录下的resources子目录复制到d:\JDK1.3.0_01\my目录之下的缘故。<BR><BR>█对MIDlet进行调试 <BR><BR>编写PalmOS上的Spotlet时，我们可以利用System.out.println()函式帮我们印出一些讯息以帮助调试，那幺在手机上的MIDlet呢? 原则上，我们还是可以利用System.out.println()函式做一些输出。当模拟器执行时，就会在命令列上输出一些讯息。<BR>另外，在PalmOS上，有KVMutil.prc可以帮助我们纪录程序所输出的讯息。那手机上呢? 因为没有实际的机器可以测试，因此这个问题到现在还不得而知，相信Motorola到时候会有完善的解决方案吧!<BR>在Motorola J2ME SDK内附的说明文件之中，概略地提到了调试的问题，里头提到，往后如果我们要进行机上调试(on-device debugging)的话，必须要满足几个条件: <BR><BR>机器本身要具备调试相关功能，并与KDWP(Kvm Debug Wire Protocol)兼容。因为调试时，调试工具需要利用KDWP和机器上交谈以取得调试信息。 <BR>制造厂商本身要提供下载MIDlet到手机上以进行调试的方法。 <BR>提供对MIDlet调试的工具，必须支持手机在利用KDWP调试时所使用的传输接口(例如串行口或UDP)。 <BR>嗯，看起来能够进行调试，MIDlet程序的编写应该是很方便的事情了。<BR><BR>█Motorola J2ME SDK对中文的支持 <BR><BR>相信看过RUN!PC 11月号的文章「利用Java 编写PalmOS应用程序基础篇」的读者，在编写PalmOS上的Spotlet时一定会遇到中文无法正常显示的问题。中文的问题分成两个部分，一个是在用户接口上的中文问题，一个是在命令列输出(利用System.out.println()函式所做的输出)上的中文问题，请大家做个小实验，将前面我们所编写的程序改如下:<BR>HelloMIDlet.java<BR>import javax.microedition.lcdui.*;<BR>import javax.microedition.midlet.*;<BR><BR>public class HelloMIDlet extends MIDlet <BR>{<BR>private Display firstDisplay ;<BR>private Form firstForm ;<BR>HelloMIDlet() <BR>{<BR>firstDisplay = Display.getDisplay(this) ;<BR>firstForm = new Form("哈罗!MIDlet") ;<BR>StringItem firstStrItem = new StringItem("哈罗","米德列特") ;<BR>firstForm.append(firstStrItem) ;<BR>System.out.println("MIDlet启动") ;<BR>} <BR><BR>protected void startApp() throws MIDletStateChangeException <BR>{<BR>firstDisplay.setCurrent(firstForm) ;<BR>}<BR><BR>protected void pauseApp() <BR>{<BR>}<BR><BR>protected void destroyApp(boolean unconditional)<BR>throws MIDletStateChangeException <BR>{ <BR>}<BR>}<BR>将本MIDlet编译并经过预身审核之后，我们开启模拟器来执行此MIDlet，底下为执行结果:<BR><BR><BR>用户接口输出: <BR><BR><BR>命令列输出:<BR><BR><BR>我们从结果发现，预设的编译指令会让用户接口正常输出中文，而命令列无法输出正确的中文。<BR><BR>接着请将compileAll.bat之中原本的指令<BR>javac -O -bootclasspath ..\..\lib %COMPILECLASS%<BR>修改为<BR>javac –encoding ISO8859_1 -O -bootclasspath ..\..\lib %COMPILECLASS%<BR>之后，重新编译此MIDlet执行结果: <BR><BR>用户接口输出: <BR><BR><BR>命令列输出 :<BR><BR><BR><BR>这个结果与PalmOS上所做的中文测试结果有所不同。<BR>当您编写Spotlet时，如果您使用javac 。。。指令时，您会发现模拟器上的用户接口输出是乱码，可是命令列上的输出却可以正常输出中文。但是如果您使用的是javac -encoding ISO8859_1 。。。指令，则CLDC内附模拟器上的用户接口输出或是命令列上的输出全部都变成乱码，无法正常输出中文(这个部分是因为CLDC内附模拟器实做的问题，造成与实际机器的结果有差异)。<BR>总之，如果之前您所编写的Spotlet无法在装有中文系统的实际机器或POSE上正常输出中文，请您也如法炮制，在编译指令中加入-encoding ISO8859_1，就可以在实际机器或POSE上看到正常的中文字了。<BR><BR>会产生此问题的主因，主要是因为编译好的Java类文件(byte code)之中，所有的文字编码都采用UTF8。举例来说，当您在程序码里用到"启动"这两个中文字时，<BR>"起"这个字的Big5编码为B1D2。<BR>"动"这个字的Big5编码为B0CA。<BR>我们会使用javac xxxx.java来编译原始码以产生类文件。其实这行指令，在繁体中文的Windows环境底下，相当于javac -encoding "Big5" xxxx.java。也就是说，当编译器读取到Big5编码范围的中文字时，会自动将此Big5码经过「Big5è Unicode 对照表」将Big5转为Unicode，也就是说,经过查表之后，<BR>“起”这个字的Unicode编码为555F。<BR>“动”这个字的Unicode编码为5272。<BR>然后再利用UTF8编码将此Unicode转为UTF8，储存在类文件之中，因此，如果您用UltraEdit之类的文字编辑器查看类文件时，您会看到，<BR>"起"这个字的UTF8编码为E5959F。<BR>"动"这个字的UTF8编码为E58B95。<BR><BR>接着，当我们在程序执行时如果要将中文输出，则JVM会负责读进UTF8码，然后将其转回Unicode，最后依据您所使用的系统环境预设的编码转回Big5，再输出至屏幕上。<BR>可是经过测试结果，KVM似乎只有做到把UTF8读进来，转换回Unicode之后就直接输出了。少了转回Big5的步骤，因此，操作系统把Unicode当作Big5来处理，自然就找不到该码所对应的中文字了，也因此输出的是一堆 ????? 的符号。这也是我们在PalmOS上即使装了中文系统，也无法正常显示中文的缘故。<BR>OK，既然知道KVM只帮我们做了一半的工作，那事情就好办了，我们只要让UTF8转回之后，仍然保有Big5的编码方式即可，于是我们使用指令javac -encoding ISO8859_1 xxxx.java，请编译器不要将程序码中中文Big5编码的两个byte视为一体(因为视为一体就会引发查询Big5 è Unicode对照表的工作)，只要将中文当作是普通的西欧字母字集即可，因此，当我们使用了上述指令，您会发现类文件之中的中文变成，<BR>"起"这个字的UTF8编码为C2B1 C392。<BR>"动"这个字的UTF8编码为C2B0 C38A。<BR>大家可以发现编译器把B1、D2、B0、CA个别当作一个码来处理。于是，当KVM读到此编码时，就会将他们转回B1D2以及B0CA，然后KVM直接输出，就可以正常地使用中文了。<BR><BR>最后总结整个问题，就笔者的推断，CLDC内附的模拟器再没有使用javac –encoding ISO8859_1 xxxx.java指令之前，会在用户接口使命令列输出乱码，这才是正常的结果， 而Motorola J2ME SDK内附模拟器的用户接口中文之所以没问题，很可能只是因为模拟器操作的差异。因此根据KVM的输出结果来看，很可能在实际的手机上，我们都必须加上-encoding ISO8859_1选项才能正确输出中文吧!<BR><BR>在此特别感谢静宜大学资管系的唐恺隆(kailung.tang@msa.hinet.net)同学。因为笔者于他经过热烈的讨论之后，我们才能对J2ME的中文问题有更深入的认识 <BR><BR>█支持Motorola J2ME SDK的开发工具 <BR><BR>在编写本文的时候，支持MIDlet开发的集成开发环境(IDE)只有Motorola J2ME SDK附带文件之中所提到的CodeWarrior而已。相信其它厂商，如Borland，应该也会很快地利用其产品JBuilder的OpenTools API来支持MIDlet的开发才对，更何况Borland JBuilder目前已经有Spotlet的解决方案了。<BR>因为笔者无法拿到CodeWarrior作测试，所以无法在此提供大家相关信息，相信如果有机会的话，会另外以专文向大家介绍如何利用CodeWarrior编写MIDlet。<BR>Motorola J2ME SDK附带文件在附录的部分有对利用CodeWarrior开发MIDlet做简单的介绍，相信对初学者来说，已经相当足够了。<BR><BR>█Motorola J2ME SDK内含的辅助开发工具 <BR><BR>在Motorola J2ME SDK之中内含三项辅助开发工具，可以便利我们的程序开发工作，它们分别是: <BR><BR>J2ME模拟器(J2ME Emulator)<BR>让您可以在您的PC上模拟Motorola将来会支持J2ME的手机装置。如此一来就可以在PC上直接测试写好的程序。 <BR>Bytecode验证器(Bytecode Verifier)<BR>此验证器用来验证类文件(classfile)之中的bytecode不会对存储器做非法的存取。并确认载入虚拟机器的类文件所做的所有动作皆符合Java虚拟机器规格(Java Virtual Machine Specification)。 <BR>配置编辑器(Configuration Editor)<BR>让您能够建立或修改device profile。 <BR>在Motorola J2ME SDK内附的文件之中对这三个工具有详细的说明，笔者在此就不再赘述了。<BR><BR>█总结 <BR><BR>呼!好累人，终于到了该做总结的时候了! 大家以为MIDlet就这样结束了吗?不! MIDlet还有许多好玩的玩意儿呢! 我们将在本系列之后的文章中为大家更深入探讨MIDlet。咱们下次见。<BR><BR>█附录:范例程序 <BR><BR>Motorola J2ME SDK之中内附许多有趣的范例，它们位于demo/midlets/目录底下。有兴趣继续精进的读者可以由这些范例学到更多有关MIDlet的深入技巧，由于这些范例的执行画面过大，所以在本文之中就将他们省略，请读者们自行参考说明文件。<BR>这些范例程序有:<BR>Bounce<BR>com.mot.j2me.midlets.bounce.Bounce<BR>PaddleBall<BR>com.mot.j2me.midlets.paddleball.PaddleBall<BR>Scribble<BR>com.mot.j2me.midlets.scribble.Scribble<BR>FontDemo<BR>com.mot.j2me.midlets.tutorials.FontDemo<BR>GraphicsDemo<BR>com.mot.j2me.midlets.tutorials.GraphicsDemo<BR>RecordStoreDemo<BR>com.mot.j2me.midlets.tutorials.RecordStoreDemo<BR>UDP Tutorial Application<BR>com.mot.j2me.midlets.tutorials.UDPReceive<BR>AlertTest<BR>com.mot.j2me.midlets.tests.AlertTest<BR>ChoiceGroupTest<BR>com.mot.j2me.midlets.tests.ChoiceGroupTest<BR>DateFieldTest<BR>com.mot.j2me.midlets.tests.DateFieldTest<BR>FormTest<BR>com.mot.j2me.midlets.tests.FormTest<BR>GaugeTest<BR>com.mot.j2me.midlets.tests.GaugeTest<BR>KeyEventsTest<BR>com.mot.j2me.midlets.tests.KeyEventsTest<BR>TextBoxTest<BR>com.mot.j2me.midlets.tests.TextBoxTest<BR>TextFieldTest<BR>com.mot.j2me.midlets.tests.TextFieldTest<BR>TickerTest<BR>com.mot.j2me.midlets.tests.TickerTest </DIV><img src ="http://www.blogjava.net/jiansong/aggbug/29527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-02-04 14:27 <a href="http://www.blogjava.net/jiansong/articles/29527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样使用摩托罗拉模拟器Motorola SDK v3.1 for J2ME（转载）</title><link>http://www.blogjava.net/jiansong/articles/29528.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sat, 04 Feb 2006 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/jiansong/articles/29528.html</guid><wfw:comment>http://www.blogjava.net/jiansong/comments/29528.html</wfw:comment><comments>http://www.blogjava.net/jiansong/articles/29528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiansong/comments/commentRss/29528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiansong/services/trackbacks/29528.html</trackback:ping><description><![CDATA[<DIV class=postbody>怎样使用摩托罗拉模拟器Motorola SDK v3.1 for J2ME<BR><BR>大家都曾经在网上下载过手机游戏或者J2ME的应用软件来充实自己手机里的Java程序， 但是，往往是辛辛苦苦下载的东西或者不能用，或者不符合自己的使用需求，造成很多浪费。对于只能通过GPRS上网的方式来获得软件和游戏的玩家就更加不方便了，因为好不容易花了银子又不能用，多心疼啊：） <BR>Motorola SDK v3.1 for J2ME 是Moto出品的手机模拟器，具有强大的模拟功能，我们在下载程序以后可以在模拟器上先运行一下，看一下结果，满意后再下载到手机当中。在手机编程当中，模拟器更是必不可少的工具。还有一些只能安装在别的型号手机上的游戏，就可以在模拟器上过把瘾了！ <BR>1. 软件安装： <BR>在http://kb.motorola.metrowerks.com/motorola/pcsHome.do可以下载到Motorola SDK for J2ME的最新版本，这里以3.1版本为例进行说明。zip文件解压缩以后成为Motorola SDK v3.1.1 for J2ME.exe， 运行安装程序，将它安装到c:\program files\motorola 当中。 <BR>安装完毕以后在开始菜单当中出现Motorola SDK v3.1 for J2ME菜单，包括两个配置菜单，一个文档菜单和一个运行程序菜单Motorola Launchpad. <BR>2. 下载或编写J2ME程序： <BR>在网上下载一个适合手机版本的J2ME游戏，或者自己编写一个J2ME程序，打包成jad文件和jar文件， 比如我们写了一个名叫Tetrix的游戏，一个俄罗斯方块的游戏， 包括Tetrix.jad, Tetrix.jar两个文件。 <BR>3. 运行J2ME程序： <BR>点击Motorola SDK v3.1 for J2ME程序组当中的Motorola Launchpad启动模拟器。 <BR>选项说明如下： <BR>Handset: 适用的手机型号，如388_Simplified_Chines, A830, V60i, T720i, StarTac, Mp3_Player等，我们选择T720i； <BR>Language: 适用的语言，有ENGLISH, SIMPCHN, TRADCHN, 分别代表英语，简体中文和繁体中文。我们选择SIMPCHN, 注意有些手机不支持中文，有些程序中有中文，需要选择中文才能显示； <BR>Advanced: 高级属性，均为预设，一般不需要更改，如果不小心误操作，可以按default恢复初始值； <BR>Class Name: 曾经运行过的程序的列表，再次运行时可以从此选择； <BR>Run from JAD/JAR: 从jad, jar文件运行，第一次运行要点选此项，点击Browse,选择要运行的程序jad 文件； <BR>Keep Launchpad open after MIDlet launch: 在程序运行完毕不关闭Launchpad, 一般要选取此项，因为可能要同时测试多个J2ME程序； <BR>Keep command window open after completion: 在程序运行完毕后不关闭命令窗口，一般不选此项，命令窗口主要是在调试过程中看中间结果； <BR>Save command line to batch file: 把执行过程命令存成bat批处理文件。这样只要执行这个文件就可以了，不用开启Launchpad； <BR>最后一栏是命令行的说明，至此，设置都已完成，点击Launch来运行J2ME程序。这时将会跳出一个类似于DOS的命令行窗口。显示运行命令，过一会儿会显示T720i的界面，就和在自己的T720i手机上面运行是一样的。 <BR>几点说明： <BR>1. 模拟器运行的按键反应速度一般比实际手机快得多； <BR>2. 模拟器支持MIDP2.0但是几乎所有的手机都不支持，所以有些面向2.0写的程序在模拟器上可以正常运行，在手机上不能。 <BR>3. 运行程序之前要更改jad文件中的URL属性为当地路径，否则会找不到jar包。 <BR>4. 可以在Motorola SDK Documentation 当中得到详细的说明和编程参考。 <BR>5. 键盘上的数字小键盘和手机上的可能有所不同，有可能4,6颠倒，8，2颠倒。 <BR>好了，快下载一个尝试一下吧！ </DIV><img src ="http://www.blogjava.net/jiansong/aggbug/29528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiansong/" target="_blank">Alex</a> 2006-02-04 14:27 <a href="http://www.blogjava.net/jiansong/articles/29528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>