(原) J2ME简介及移植

9 views
Skip to first unread message

吴锷渊

unread,
Feb 27, 2007, 8:20:50 PM2/27/07
to sky-tone
过年前只有我的项目没有讲,我写了出来,大家多多交流。

J2me简介及移植

一. 什么是J2me
Java语言的一个非常重要的特点就是与平台的无关性,它的口号是"compile once,run everywhere ",为了
实现这个目标,java语言经过编译后并不是生成与平台相关的机器码,而是生成适用于在java虚拟机上运行的java字节码。这就要求所有想运行
java语言的平台都必须安装java虚拟机,而且java语言的运行还需要核心类库的支持,java虚拟机加上java的核心类库就构成了java语
言的运行环境。Java语言的运行环境包括三种j2ee(Java 2 Platform Enterprise
Edition),j2se(java 2 platform standard edition)和j2me(Java 2 Micro
Edition),其中J2me就是SUN公司针对嵌入式、消费类电子产品推出的java运行环境。同时J2ME又是一系列规范的集合,由JCP组织制
定相关的Java Specification Request(JSR)并发布,各个厂商会按照规范在自己的产品上进行实现,但是必须要通过TCK测
试,这样确保兼容性。比如MIDP2.0规范就是在JSR118中制定的。同时也规定了开发j2me程序的程序员必须按照j2me的规定来编写程
序。**
二. J2me的体系结构
J2ME平台是由配置(Configuration)和简表(Profile)构成的。配置包含小型的Java虚拟机和提供给最大范围设备使用
的最小类库集合。简表是针对一系列设备提供的开发包集合。
目前,J2ME中有两个最主要的配置,分别是Connected Limited Devices Configuration(CLDC)和
Connected Devices Configuration(CDC)。他们是根据设备的硬件性能进行区分的,例如处理器、内存容量等。CLDC
主要针对那些资源非常受限的设备比如手机、PDA、双工寻呼机等。而CDC主要面对那些家电产品,比如机顶盒、汽车导航系统等。
简表是架构在配置之上的,必须以配置为基础,目前与配置CDC和CLDC相对应的简表分别是基础简表(foundation profile)
和针对移动终端的移动信息简表Mobile Information Devices Profile(MIDP)。CLDC和MIDP组成的结构可以
看成是j2me环境的一个分支,专门针对移动终端(见下图)。

三. CLDC和MIDP的构成
上面提到CLDC是由小型的java虚拟机和最小的核心类库构成,小型的java虚拟机即KVM,K的意思是kb,就是说这是一个可以在只有几
十到几百Kb可用内存的设备上运行的java虚拟机。CLDC规定的最小核心类库包括java基础类库中最基本的3个:lang,util和
io。KVM是由c语言编写的,而3个java基础类库的功能是由java和c共同实现的。在CLDC中,java语言通过两种方式来调用c函数,与c
代码通讯,一种是利用jcc(java code compact)工具,一种是kni(kb级别的java native interface)。
MIDP可以理解为是对CLDC中java基础类库的扩展,同时它也是依赖于CLDC中的3个基础类库之上的。MIDP包括以下的这些包:
java.io
java.lang
java.util
javax.microedition.io
javax.microedition.lcdui
javax.microedition.lcdui.game
javax.microedition.media
javax.microedition.media.control
javax.microedition.midlet
javax.microedition.pki
javax.microedition.rms
这些包的功能的实现同样是通过java和c共同实现的,也同样是通过jcc和kni这两种方法。
四. CLDC和MIDP的移植
清楚了CLDC和MIDP的构成之后,移植的工作就相对较容易了。因为MIDP是依赖于CLDC的,所以要移植MIDP必须先移植CLDC。由
于在配套的MIDP和CLDC源代码是被设计成一起编译的,就是说MIDP和CLDC不用分开来编译和移植,只要清楚了MIDP中makefile的编
译顺序,就可以实现将CLDC编译到MIDP中去。
移植中的几个重要的问题:jcc和preverify这两个工具,makefile的顺序,ssl的源代码。
1. Jcc和preverify
Jcc的作用在上面已经提到,jcc(java code compact)又被称为java类预连接器和预加载器,它允许java的
类被直接链接到KVM中,这样大大提高了KVM的启动速度。为了实现这个功能,jcc会将java的类连接起来并生成一个c文件,以便被链接和加载到
KVM中去。
Preverify是预校验工具,它的作用是提高java程序的运行速度,因为KVM的功能是有限的,而j2se的类校验(verify)会耗
费一定的存储空间,至少50kb的代码空间和运行时30-100kb的动态RAM。这种校验机制的开销对j2me这样运行在有限资源设备上的环境来说是
较昂贵的。所以j2me的校验机制分为两部分,一部分在开发j2me程序的开发平台中先对java的类进行预校验(preverify),并为java
的类附加上校验信息;另一部分在j2me环境中,只校验附加在类上面的校验信息,这样就大大提高了运行速度。
这两个工具的源代码在CLDC的源代码包中均有提供,明白了这两个工具的作用之后,自然和清楚这是要在宿主平台上运行的工具,不可以用交叉工具
链来编译。
2. Makefile的顺序
上面提到CLDC是被设计成与MIDP一起编译的,所以只有整理清楚MIDP中makefiles的顺序才能很好的进行移植。MIDP的
makefile从结构上分为"定义"和"执行"两类。"定义"是定义一些环境变量和目标平台变量等,文件名一般以Def或者pre-def开头;"执
行"就是真正执行make规则的文件,最主要是MIDP.gmk和VM.gmk两个文件。
从功能和步骤上来说,makefile主要是实现了:
⑴. Builds the preverifier
⑵. Creates the ROMizer
⑶. Compiles and preverifies Java code
⑷. Creates the classes.zip file
⑸. Reads classes.zip and generates ROMjavaplatform.c
⑹. Builds the extractOffsets tool
⑺. Uses the extractOffsets tool to generate header files with offsets
into the
classes of the Java programming language
⑻. Compiles CLDC and MIDP C files
⑼. Links the CLDC and MIDP C file
⑽. Creates the MEKeyTool and JadTool utilities
⑾. Creates the MidpInstallDir/build/appdb directory
3. ssl的源代码
ssl的实现也是通过java和c共同完成的,在MIDP的源代码中没有提供ssl的源代码,编译过后的.class文件和.o文
件,.class文件是跟平台无关的,但.o文件只是适用于x86平台的。所以必须找到与java对应的c代码的源文件,并用kni来实现java对c
函数的调用。
吴锷渊 2007-2-15
参考:
**《 J2ME技术概述》作者:mingjava 来源:www.j2medev.com

Reply all
Reply to author
Forward
0 new messages