文章来源:J2ME开发网
Nokia系统bug两则
1 Nokia7650(V4.46)应用程序目录显示bug
应用程序安装后,打开应用程序目录,显示错误提示:
"程序已关闭 MidpUi USER9",应用程序目录无法进入。
分析后发现,原来是新安装的应用程序没有在mainfest.mf中的
midlet-1属性中指定应用程序图标,导致程序目录无法显示图标。
在我所见到NokiaS40机器上和NGageQD上,如果图标没指定或指定了但
不存在,将显示默认的图标。
此bug对于其它版本的7650或者其他机型是否存在尚不得知。
解决方法:使用seleQ将7650c:\system\midp中刚安装的程序目录删掉,即可正常进入应用程序目录。
在应用中使用自己的应用程序图标,并正确设置,以避免让用户遭遇到此bug。
2 Nokia3100(v3.10)游戏目录振动设置与应用程序中使用振动冲突的bug
在Nokia3100等机型中,提供了一个游戏目录管理游戏类应用。该目录
可以设置目录中的游戏运行时是否发声,振动和使用网络。对于
Nokia3100(V3.10)如果将振动设置关掉,而在应用程序中使用了振动,则
会产生一个异常。此bug是在10个月之前发现的,记不清是哪个异常了。
此bug对于其它版本的3100或者其他机型是否存在尚不得知。
解决方法:在应用程序中使用振动的地方增加异常处理。
----------------------------------
程序出现exception时,在一个外包函数处捕获到了,显示为函数a出现异常,然后去a中捕获却没捕获成功,但是仍然发生了异常.
原来是外包函数中调用的另一个函数b也产生了同样的异常.
同时多处异常-小心!
----------------------------------
1.在工具条上有个文本形象的按钮"show source of selected element only".当编辑类的某个成员(方法或域)时,按下这个按钮,则当前窗口会只显示你正在编辑的类成员.再按一下则恢复.
2.显示java文件行号.菜单中选择Window->Preferences打开Preferences窗口后选择Java->Editor,在右边的选项中选中Show line numbers.
显示非java文件行号.在Preferences窗口中选择Workbench->Editors->Text Editor,同样右边的选项中选中Show line numbers.
3.编辑代码时,按ctrl+/可以注释当前行或选中的多行代码;按Atrl+/可以显示自动完成代码的提示。
4.选中代码,按 ctrl+shift+F 格式化代码
5.输入syso,按atrl+/可出来 System.out.println("") ;
-----------------------------------
1 旋转后,并以clip的方式向缓冲上贴图,clip无效
2 无法创建透明muttable Image
此两点,致命伤,带来许多不变
-----------------------------------
产生0~n之间的随机数
(ran.nextInt()>>>1)%n
或
(ran.nextInt()&0x7FFFFFFF)%n
产生-n~0之间的随机数
(ran.nextInt() | 0x80000000 )%n
-----------------------------------
症状:模拟器自动关闭,没提示任何错误
原因:使用了Nokia UI API中的灯光或振动控制,而Nokia S60部分机型和对应的模拟器不支持这两个特性.
------------------------------------
检测机型,总是有点用处的
在J2ME开发中,往往遇到根据不同机型做不同事情的情况,比如Nokia3650的键盘比较特殊,Nokia7650不支持mmapi,所以需要获得机型信息。
下面是一段简单的代码
public static void checkPlatform()
{
String platform = System.getProperty("microedition.platform") ;
String tmp = null ;
if(platform.length()==9)
tmp = platform ;
else if(platform.length()>9){
tmp = platform.substring(0,9) ;
}
if(tmp!=null){
if(tmp.equals("Nokia3650")){
is3650 = true ;
}
else if(tmp.equals("Nokia7650")){
is7650 = true ;
}
}
}
获得机型信息还包括版本号等等,所以要截取前面的几个字符比较。
不过得到的机型字符串有时并不保险,如早期的Nokia N-Gage获得得并不是N-Gage,不过3650和7650还是可以的
------------------------------------
CLDC和MIDP都没有提供三角函数,而且CLDC1.0中也没有浮点数,所以我们的选择是查表。使用8位定点数的sin和cos表。下面是wtk自带demo中的代码,只提供了有限的几个角度,实际使用时根据需要细化角度值。
// sines of angles 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, all *256
private static final int[] SINES =
{ 0, 44, 88, 128, 165, 196, 222, 241, 252, 256 };
// angle is in degrees/10, i.e. 0..36 for full circle
private static int sineTimes256(int angle)
{
angle %= 36; // 360 degrees
if (angle <= 9) // 0..90 degrees
{
return SINES[angle];
}
else if (angle <= 18) // 90..180 degrees
{
return SINES[18-angle];
}
else if (angle <= 27) // 180..270 degrees
{
return -SINES[angle-18];
}
else // 270..360 degrees
{
return -SINES[36-angle];
}
}
// angle is in degrees/10, i.e. 0..36 for full circle
private static int cosineTimes256(int angle)
{
return sineTimes256(angle + 9); // i.e. add 90 degrees
}
---------------------------------------
Nokia7650,3650
游戏运行过程中,有时会出现“存储已满”的对话框,出现的位置不固定
游戏运行过程中,有时出现“应用程序错误 NullPointerExcept”,“程序已关闭 MidpUi”的对话框
游戏运行过程中,有时会出现“程序已关闭 MidpUi ViewSrv 9”的对话框,出现的位置不固定
其实这个问题是由S60的getResourceAsStream方法内存泄漏的bug引起的,由于每次切换地图时io操作都要读取大量数据,内存泄漏积累到一定程度就引起了“存储已满”,白屏,死机,进而会引起null pointer异常等。解决方法是尽量减少io操作的次数。如果内存够大就一次将资源读入。
----------------------------------------
初次使用JBuilder 7-若干小问题
1 MobileSet问题
JBuilder7需另外安装MobileSet, Mobileset自带了一个WTK. 如果不安装MobileSet,JB7配置JDK时不能自动识别WTK,安装MobileSet后,可以通过配置JDK的方法加入新的WTK
2 资源文件问题
JBuilder的所有源文件都应该放在source path中,可以在工程属性中设置source path,资源文件也一样。既可以和源文件放在一个source path(即文件夹)中,也可以放在另外的source path中。需要注意的是,JBuilder只默认识别一定数量的后缀,如png,如果你使用了其他后缀的资源文件,如dat,bin,需要先把该文件通过add files加入到工程中,选择文件属性,设置为copy,这样该后缀的文件就被识别为资源文件了。
3 光标不对问题
最简单的办法-改字体,我改成了第一种字体(JB7中),感觉和默认字体没什么不同。至于这个问题的根本解决方法网上有文论述。
4 鼠标滚轮无效问题
据说这个问题只在JB7和以下版本中存在,原因是只有J2SDK1.4以上才支持滚轮,所以需要将JB7的JDK改成1.4的. 方法是修改JBuilder7\bin\jdk.config文件,将javapath和addpath两行修改,例如:
# javapath ../jdk1.3.1/jre/bin/hotspot/jvm.dll
javapath Y:\j2sdk1.4.2\jre\bin\server\jvm.dll
# addpath ../jdk1.3.1/lib/tools.jar
addpath Y:\j2sdk1.4.2\lib\tools.jar
-------------------------------------
这是一个老问题了,原来用WTK的时候就有,在WTK中启动Nokia的模拟器,如果先前已经打了包,那么运行的是打包的程序,想当年经常会很郁闷为什么改动了没效果,后来养成一个习惯,将jar装到手机测试后随手删除。
今天用JBuilder的时候又碰到了这个问题,也是Nokia的模拟器,如果已经建立了一个archive,那么Nokia模拟器运行的总是包,呵呵,所以要么将archive从project中remove,要么每次都rebuilder这个archive。