J2ME->BREW移植中J2ME Coding的注意点

J2ME->BREW移植中J2ME Coding的注意点
1. BREW的单线程机制导致的问题:
 
BREW本质是事件驱动的,要模拟J2ME环境下的线程,只有通过定时器的机制。但是,BREW在处理事件响应的回调函数时,是拒绝响应任何硬件事件的,因此过长的回调函数可能会导致硬件不响应“接听电话、收短消息”的事件,这也就是ubt测试中连续发5条短消息的这一项Failure的根源。
 
此外,ubt还要求若硬件一段时间内未响应,应当有屏幕提示。但BREW中,在回调中进行屏幕的刷新是无效的,即必须结束回调,将CPU交给系统,屏幕方才得到更新。
 
J2ME开发时的建议:应该将Loading部分(实际上,包括任何的长处理函数和函数体内需要屏幕更新
的处理函数,尤其是涉及到IO的函数)切割成较短的函数,放入run循环中。

 这部分内容应该在J2ME编程时就考虑到。BREW移植阶段进行修改会导致结构的破坏,从而可能导致新的错误,还会导致J2ME版本和BREW版本的不一致,使得代码可维护性变差。J2ME编码时就考虑到这个问题,还有助于纵向移植的效率,由于硬件参数的不同,同一应用的纵向移植(J2ME->BREW)可能不止一次。

2.BREW的字符串导致的问题:
为了使Java代码能够在形式上尽量少作改动而直接迁移到BREW的C++代码上来,我对String、乃至Object等基本类型类进行了一些封装。但是,鉴于ARM本身的一些动态联编的限制,无法在类的构造函数内进行空间的分配。因此,现在的String类采取一种折中的办法处理。
 
构造函数(包括拷贝构造函数)String类不另分配空间,直接从参数(AECHAR*或String)中获得字符串的指针。而对String类的赋值符号进行重载,凡赋值获得的字符串是为其开辟空间的。
 
例如:
 String str1 = L"abc";
 String str2; str2 = L"abc";
 String str3 = str1;
 String str4; str4 = str1;
 其中,str1、str3是未分配字符串空间的,随着局部常量L"abc"的释放,它们的实际值就不存在了。好在,使用定义时初始化字符串的情况,绝大多数是局部变量(类的成员变量,我通过翻译器会在ON_START()函数中赋值,在ON_END()函数中将其清空),因此它们不会在它在作用域外被引用到。
 
 唯一要注意的是以下场景:
 String str1 = L"abcd";
 String str2 = str1.substring(1,2);
 substring所返回的String值在初始化语句过后进行析构,str2实际所指向的字符串指针中的内容已经不存在了。因此,要使用返回值为字符串的函数,应该用赋值语句(String str2; str2=str1.substirng(1,2)),如果只是一次性的使用,这样写也是可以的:
 drawString(str1.substirng(1,2), ...);
 总之,这部分内容J2ME编码时应该注意一下,慎用初始化语句,尽量改用赋值语句。程序中一旦发生字符串内容未清空或内容误清空,这样的错误是很难捕捉的。
 
3.C++与Java语法上的细微差异所导致的问题
1) C/C++不允许初始化语句跨越switch-case语句,例如:
 
 switch(i){
 case 0:
 int n = 0; // int n; n = 0;
 break;
 case 1:
 int m = 1; // int m; m = 1;
 break;
 }
 
 以上语句,Java可以编译通过,C++不能。
 因此,在这种场景下,J2ME编码阶段应尽量使用赋值语句,而不使用初始化语句。
 
2) Java中有>>>和<<<运算符,C++中没有。
 尽量避免使用该运算符,尽管C++中手动将其修改成>>和<<在绝大多数情况下不会造成问题,但终究可能有隐患存在。
 
3) Java中的Byte类型实际为signed char,而在BREW中的Byte类型被定义为unsigned char。
 
 在该变量有可能变为负值的情况下,而无须考虑到位数因素的情况下(该变量不会被存储,或用作位运算),应尽量用short,否则所引起的逻辑错误也是很难捕捉的。 我所做的翻译器可以把byte替换成signed char,但毕竟没有经过实践的检验,可能存在隐患。
 
4) 最好不要使用上限变长的数组,尤其是多维数组。
 
4.实例缺乏监控机制所导致的错误:
 
 Java的对象实际上是指针,它指向null或者是new出来的对象实例。当一个实例不再有对象指向它,它将会被gc时销毁释放。BREW是不支持静态变量或者全局变量的,这就意味着很难对实例进行监控,何时释放内存空间(BREW中可能是对象接口)变成为了问题。

 在这里,我封装J2ME中几个常用类(Image类、Sound类等等)时,将构造函数以及赋值函数定义为,指针的复制,没有进行新实例的创建,这点和String类有区别。此外,还对赋值函运算符重载,如果赋值为null则直接清空空间或释放接口。
 因此,在使用Image类和Sound类有关的对象需要注意:
 尽量保证一个对象对应一个实例,如果使用了多个对象指向某实例,应该在最后一次使用该实例后,将其设null析构,而之前不要对任何指向该实例的对象设null(如果需要通过判断是否为null来进行流程控制,则建议考虑使用布尔变量来辅助标识)。
 
5.没有错误捕获机制所导致的错误:
 
 BREW中无法使用try-catch来捕获错误。在我的翻译器中,直接忽略catch(){}中的语句,把try{}中的语句拿到外面来。
 因此,需要尽量避免在catch(){}体内写有实际意义的代码。例如,try{}中打开一个文件,catch到如果文件不存在,则在catch(){}中新建之。如果,无法用其他方式来实现同样的功能,希望能用/*...*/来明确的进行注释,或者在移植前直接告知,便于移植时及时发现这个漏洞。
 
6.其他建议:
 
 如5中所述的新建或打开已存在文件这样的问题,如两大平台在图像和声音资源导入方式上的不同。能否考虑在J2ME上和BREW上都封装一层,使以后的J2ME应用都使用统一的函数来实现“新建或打开文件”、各种“导入图像”的方式、“导入声音”的功能,这样可以保持J2ME和BREW代码上形式上的统一。有利于提高移植效率,也减少在资源加载上出错的几率。

 这条如果可行,可以进一步讨论。
添加评论
单击隐藏此项的评论。
2月14日
MapXtreme 2004的安装
1) 下载
 
先下载MapXtreme 2004的试用版本,使用期限为60天。下载前需要注册一个免费的帐号。下载地址为: http://extranet.mapinfo.com/products/Download.cfm?ProductID=1849
 
有4个文件可供下载:
MapXtreme 2004 Eval   (MapXtreme62TRIAL.exe)
Sample Data    (sampledata.exe)
.NET framework SP1    (NDP1.1sp1-KB867460-X86.exe/WindowsServer2003-KB867460-x86-ENU.exe)
MapXtreme 2004 v6.2 Release Notes   (MapXtreme2004_62_RN_CHS-A4.pdf)。
 
2) 升级
 
先运行NDP1.1sp1-KB867460-X86.exe(如果OS是Win2003,用WindowsServer2003-KB867460-x86-ENU.exe),把VS.NET 2003升级到1.1 SP1。
如果升过级,这步可以跳过,升级程序也可以从ms的官网上下载。
 
如果OS为Win2K,需要升级到SP4,可以到ms的官网升级。
 
3) 安装
 
运行MapXtreme62TRIAL.exe进行安装,MapXtreme 2004无法选择安装目录。
地图的安装运行sampledata.exe。
 
添加评论
单击隐藏此项的评论。
2月13日
MapXtreme for Java的安装
1) 下载
 
先下载MapXtreme for Java 4.7的试用版本,使用期限为30天。下载前需要注册一个免费的帐号。下载地址为: http://extranet.mapinfo.com/products/download.cfm?ProductID=1162
 
有4个文件可供下载:
MapXtreme Java v4.7.1 Install    (MapXtreme_Java_47_install.exe)
MapXtreme Java v4.7.1 War file utility    (MapXtreme_Java_utility_install.exe)
Documentation    (MapXtremeJava471ReleaseNotes.pdf)
Evaluation Data    (sampdata.exe)。
 
 
2) 安装
 
运行MapXtreme_Java_47_install.exe。
MapXtreme for Java 4.7需要Java虚拟机1.4.1以上的版本。安装程序会列举当前系统已有的VM及其版本(例如,JBuilder X的VM版本为1.4.2,如果安装过JBX就无须另外安装VM了)。当然,安装程序也提供VM1.4.1的安装。
 
3) 地图的安装
 
运行sampdata.exe。
 
 
4) WebServer的配置 (可选)
 
MapXtreme for JavaJ需要支持J2EE的Web Server。该服务器要支持Servlet/JSP插件或有独立的Servlet容器。同样地,MapXJ安装文件自带了Tomcat 4.1。当然MapXJ也支持其他的J2EE Server,不过配置起来就比较麻烦,需要手动地使用WarFile生成器。
运行MapXtreme_Java_utility_install.exe。
之后的具体步骤参考《MapXtreme Java版开发人员指南》。
 
5) 调试
 
选择“开始菜单”中“MapXtreme for Java 4.7”程序组里的“Startup.bat”,可以打开Tomcat服务器。
打开IE,通过URL http://localhost:8080/index.html来测试之。其中包括了一些Sample和Tomcat服务器的管理工具。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值