原创 嵌入式Linux平台下的J2ME移植-转

2011-1-15 23:18 1919 6 6 分类: MCU/ 嵌入式

最近在学习如何将J2ME移植到嵌入式Linux平台,在网上找了很多资料,现整理如下,方便日后移植。


一、相关概念

J2ME是Java 2标准版本的微型版本。支持各种各样的消费类产品和嵌入式设备,如移动电话、PDA、互联网可视电话、数字机顶盒、车载娱乐和导航系统、网络交换设备以及信息家电等。J2ME是为了那些使用有限的能源、有限的网络连接(通常是无线连接)以及有限图形用户界面能力的设备开发的。它最初的目标是16位或32位处理器,16M 时钟频率,512KB或更少内存的设备。J2ME用配置(Configuration)来封装虚拟机。配置由一个虚拟机和一组支持的核心API组成。配置层上面是配置文件(Profile)。在一个配置上面可以有多个不同的配置文件。配置文件是在配置的基础上进一步细分一组特定设备,并定义一组支持这类设备的类库。鉴于应用J2ME的硬件平台有着较大的差异,所以根据硬件的差异分成两类:CLDC(Connected Limited Device Configuration)与基于其上的Foundation Profile和Personal Profile,以及CDC(Connected Device Configuration)与基于其上的MIDP(Mobile Information Device Profile),如图一所示。

┌──────────┐┄┄┄┄┄┄┄
│MIDlet            │ 应用程序
├──────────┤┈┈┈┈┈┈┈
│ MIDP             │ proflie层
├─────── ── ┤┄┄┄┄┄┄┄
│J2ME核心API   │ configuration层
├──────────┤ CLDC
│ KVM               │
├──────────┤┈┄┄┄┄┄┄
│特定的硬件       │
└──────────┘
图一 J2ME的CLDC & MIDP架构

J2ME的CLDC包括K虚拟机(KVM)和一组核心类库,主要是针对用户接口简单、内存较小、网络运行时连时断以及带宽较窄的小型无线设备。其中KVM是JVM的一个实现,特别用于如移动电话、PDA等设备。MIDP具体定义了J2ME适用的硬件和软件框架,并提供了这个框架要实现的基本功能及标准接口;应用开发者可以基于这个框架开发出各种应用。MIDP 2.0定义了一系列软件接口,包括基本输入/输出、图形用户接口、网络、事件机制、文件系统、应用管理系统、游戏接口、声音输出接口和安全机制。


二、J2ME的移植

Sun公司在其网站上提供了J2ME参考实现的源程序包,所谓J2ME的移植,就是依据本身目标平台的特性作相应的修改,使之最终能运行在目标平台上。J2ME的移植包括KVM的移植和MIDP的移植。


1、KVM移植

目前最常见的版本是1.1,其参考实现的文件名为j2me_cldc-1_1-fcs-src-winunix.zip。根据CLDC的移植说明文件所说,如果目标平台有支持足够的底层API的话,几乎可以不用作任何修改,就可以将整个KVM直接移植到您的操作系统上。但在实现时,由于底层操作系统的特性不同,需要修改一下KVM的源代码。这些特性包括:如何开启文件档案、如何动态取得内存、如何将窗口系统移植上去、如何处理不同CPU之问的特性、如何处理64bits运算等。

在移植过程中,主要涉及的问题有:对64bits长整数的支持、浮点数的支持、Endianness特性的考虑、类路径的问题、内存管理问题、图形用户接口问题、平台规格及特性问题以及中文化问题等。

1.1、KVM移植到嵌入式Linux设备的步骤

a、建立交叉编译环境

下载xscale-arm-linux-toolchain.tgz,tar zxfv xscale-arm-linux-toolchain.tgz,将解压后的文件在/usr/local/arm-linux下,将他击入当前的路径下,比如修改你的.bash_profile,PATH=$PATH:/usr/local/arm-linux/bin,退出,在登陆使之生效,输入 arm-linux-gcc -v可以查看gcc的版本;

我们还需要安装交叉编译环境的标准C函数库,进入系统的/usr/目录并解压库函数软件包

[user@host]# cd /usr
[user@host]# tar zvxf /root/gnupro-bin-glibc2.2.4.tgz

上述命令会在系统目录/usr/cygnus/xscale-020726/H-i686-pc-linux-gnulibc2.4/目录下建立一系列的子目录和文件,它们是交叉编译时需要的标准C函数库和各种工具。

b、下载SUN的CLDC

到网上下载SUN的CLDC源代码包并解压:j2me_cldc-1_0_4-src-winunix.zip或者j2me_cldc-1_1-fcs-src-winunix.zip,分别对应CLDC1.0/CLDC1.1版本。

c、修改代码,使之适合于arm-linux环境

第一处:修改j2me_cldc/kvm/VmUnix/build/目录下的makefile文件

进入j2me_cldc/kvm/VmUnix/build/,vi Makefile,主要修改将原来使用的x86的编译器GCC改为我们的arm-linux-gcc,这样才能得到我们的所需,我主要是修改下面的句子:
ifeq ($(GCC), true) CC =arm-linux-gcc

另外在文件的开始指定export PLATFORM=linux

第二处:修改j2me_cldc/kvm/VmUnix/src/runtime_md.c文件

把这个文件中void InitializeFloatingPoint()函数中的两句注释掉:

#if defined(LINUX) && PROCESSOR_ARCHITECTURE_X86
/* Set the precision FPU to double precision */
// fpu_control_t cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) | _FPU_DOUBLE;
// _FPU_SETCW(cw);
#endif

这样,编译的时候才不会出现错误,但也不支持浮点数了。

d、编译生成KVM

修改完成之后,然后进入j2me_cldc-1_1-fcs-src-winunix/kvm/VmUnix/build目录,make,这样就会在此目录下生成KVM可执行bin文件。

1.2、在板子上运行并进行相应的测试

a、在PC的linux环境下安装j2sdk-1_4_2_18-linux-i586.bin,并设置此jdk的环境变量

直接运行此bin文件便可以顺利安装,主要问题在于jdk环境变量的设置。

打开根目录下的.bash_profile文件(隐藏文件,按ctrl+h显示),添加如下代码:

JAVA_HOME=/home/j2sdk-1_4_2_18/j2sdk1.4.2_18
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/lib:/root/JAVA
export JAVA_HOME PATH CLASSPATH

需要根据实际解压位置作适当的修改,上面所说的解压位置为/home/j2sdk-1_4_2_18/文件夹下,其中PATH是指指令的搜索路径,比如说用javac去编译一个.java文件,直接在命令行中用javac就可以,而不要代绝对路径了。CALSSPATH中的 $JAVA_HOME/lib 为你的java代码运行的类路径,/root/JAVA 为编译你的java代码生成的class所放置的路径。

b、编译生成preverify

直接进入tools/preverfiyer/build/linux下,make,这里没有必要对这个makefile进行修改。可以看到此时在目录下生成了preverfiyer可执行文件。

c、运行helloworld并正确使用preverify

这一步准确来说不是移植要做的事情,因为这是j2me开发者要注意的事情.我们先来看看kvm的执行.class 文件的机制:


如图所示:我们javac编译完的生成的.class文件必须经过preverify预验证后才能被KVM正常的执行,否则会出现java/class /Verifyerror,为什么要采用预验证机制,是因为SUN考虑到嵌入式设备资源有限,所以将JVM的庞大字节码验证机制进行严重的”缩水”,也就用了一个轻量级机制来保证安全。

步骤:

1、编译javac -classpath kvm/classes hello.java 这里kvm/classes指你编译生成的classes文件夹
2、预验证preverify -classpath kvm/classes -d . mydir

preverify有几个参数:-classpath 同上 -d 输出验证后的class文件,默认的是当前目录下的output文件夹下,还有检测是否使用了 finalizers 、float、native methods等。

将检验后的classs文件放到板子上,就可以执行了!


2、MIDP移植

目前最常见的MIDP版本是2.0。Sun在网上发布的参考实现名字是midp.2_0-src-linux-i686.zip。MIDP定义了一系列适用于移动通信设备之上的Java软件接口。其中,有很多与系统平台相关的接口。所谓MIDP移植,最基本的就是修改MIDP参考实现里面与系统平台不匹配的接口。换言之,就是用目标系统平台的API替换MIDP参考实现中与之不匹配的API,使MIDP能在目标平台上正确地执行所有要求的功能。当然,移植还包括对MIDP性能的优化。

MIDP由多个不同的模块组成,包括事件处理、记录管理系统(RMS)、图形用户接口、安全机制、网络、应用管理系统(AMS)、 OTA支持、Push Functionality、游戏接口以及I18N。这些模块中,基本上分成两层来实现:①Java层。用Java编程语言编写,与平台无关。这部分可以不用修改。②本地层。用C编程语言实现,与平台相关。这部分用到的API如果与系统平台提供的API不一致,就需要作修改。

相对于KVM的移植,MIDP移植更为复杂,具体可以参考http://www.gd-emb.org/detail/id-12070.html

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/biaozai06/archive/2009/03/26/4026903.aspx

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条