Chinaunix首页 | 论坛 | 博客
  • 博客访问: 73526
  • 博文数量: 21
  • 博客积分: 99
  • 博客等级: 民兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-17 16:39
文章分类
文章存档

2013年(3)

2012年(17)

2010年(1)

分类: LINUX

2012-08-24 11:05:32

上kvm能正常在板子上运行了,并且还解决了preverify的问题(感谢一下陶老师的帮助和提醒),今天一并完整的写出来整个过程吧

  1. 建立交叉编译环境:
    • 下载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函数库和各种工具。
  2. 下载sun的cldc的src

    解压,里面包含有相关的源码。我这里使用了j2me_cldc-1_0_4-src-winunix.zip,j2me_cldc- 1_1-fcs-src-winunix.zip这两个都可以在sun的网站下载,不过推荐大家抓紧时间下载,因为今天去下载midp2.0就已经不能下 载了(sun阿,令人失望!)。

  3. 安装jdk并设置后相关路径

    这里不推荐使用jdk1.5,因为他对中文的支持有问题,使用1.4或者更低的都可以(希望可以在sun的官方找到)
    我使用的是 1.4.2_01。修改.bash_profile或者/etc/profile添加PATH或者CLASSPATH。这里说一些为什么要用到jdk,主 要是要编译api里面的java文件,当然我们只一致kvm就不需要这个了,详细地大家可以看看解开的文件cldc文件夹里面的make文件

  4. 修改make文件

    进入j2me_cldc/kvm/VmUnix/build/,vi修改Makefile,主要修改将原来使用的x86的编译器GCC改为 我们的arm-linux-gcc,这样才能得到我们的所需,我主要是修改下面的句子:ifeq ($(GCC), true) CC =arm-linux-gcc,另外我又在文件的开始指定export PLATFORM=linux,当然你也可以在make的时候家参数PLATFORM=linux。

  5. 编译

    先编译preverify,进入tools/preverfiyer/build/linux下,make,这里没有必要对这个 makefile进行修改,况且你的编译平台是x86,应该不能进行修改,否则编译出来的preverify是不运行的,那么kvm的编译也将会不能通 过。
    编译kvm,进入kvm/VmUnix/build,make,就可以得到kvm,注意这个是在kvm的build目录下生成的,file kvm会的到以下信息:kvm: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.4.18, dynamically linked (uses shared libs), not stripped

  6. 在板子上运行并进行相应的测试

    将得到的kvm,烧到板子上,x86下kvm运行所需文件: libm.so.6 => /lib/tls/libm.so.6 (0xb75c0000)
    libnsl.so.1 => /lib/libnsl.so.1 (0xb75ab000)
    libc.so.6 => /lib/tls/libc.so.6 (0xb7473000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0xb75eb000)
    大家可以参考以下,以便能使板子环境符合要求.更改属性为a+x,运行kvm,没有任何参数的情况下将会出现以下信息:ALERT: Must provide class name
    Usage: kvm < -options>
    Options:
    -version
    -classpath
    -heapsize (e.g. 65536 or 128k or 1M)

  7. 运行helloworld并正确使用preverify

    这一步准确来说不是移植要做的事情,因为这是j2me开发者要注意的事情.我们先来看看kvm的执行.class 文件的机制:
    portingVerifiera.gif
    如 图示:我们javac编译完的生成的.class文件必须经过preverify预验证后才能被kvm正确的执行,否则会出现java/class /Verifyerror,为什么要采用预验证机制,是因为sun考虑到嵌入式设备资源有限,所以将jvm的庞大字节码验证机制进行严重的”缩水”,也就 用了一个轻量级机制
    来保证安全.说了这么多,讲讲具体怎么使用(这个流程开发j2me程序的人应该都知道点,虽然大家都不常用这个来开发).
    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文件放到板子上,就可以执行了! 

  8. 这个是移植cldc1.1的:步骤基本相同,我们主要说以下不同的地方:修改完makefile后,make,会出现错误提示:
    make: *** [obj/runtime_md.o] Error 1我们向上察看:kvm/VmUnix/src/runtime_md.c: In function `InitializeFloatingPoint’:是在函数InitializeFloatingPoint中出现错误:我们可以采取简单的方法将其 注释掉,
    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
    }当然也也可以修改一下支持flaot,ok保存以下,接着make,就ok了!goodluck!

文章来自http://blog.csdn.net/huangqiqun/article/details/1488854

阅读(3567) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~