tangl_99
最近评论
g:y
bbb:d
- -#:sshd自带sftp-server的软件
汗啊……脚本里有软件……
- -#:sshd自带sftp-server的软件
汗啊……脚本里有软件……
印刷公司:不错 , 看看!
文章分类
收藏
    相册
    链接
    高等数学复习公式
    我的简历
    英文简历
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 编译KVM收藏

    新一篇: 增加KVM中的系统调用API | 旧一篇: 经典的文章无论如何也要再次转贴(Linux内核编译过程)

    编译KVM

       KVM可以说是JVM中比较小而且比较原始的一个版本。KVM是一般放置在嵌入式设备,比如手机等资源有限的终端内运行。KVM没有采用HotSpot JVM里面诸多优化技术,代码十分简单,有利于我们理解JAVA程序的执行过程。虽然KVM里面执行JAVA程序可能与现在PC上流行的JVM不太相同,但是大致原理是相似的。
       下面是我在Windows编译KVM的过程。


    1.下载KVM源代码

    http://www.sun.com/software/communitysource/j2me/cldc/download.xml

    现在有cldc1.1和cldc1.04的两个版本。差别不是很大。我选择的是1.1的版本的KVM源代码。

    2.下载Cygwin

      Sun提供的KVM虽然有VC6下编译的工程,但是整个编译过程还是有部分需要Cygwin的参与。Cygwin提供了Linux下的make,gcc,grep,find等很多程序,这些程序在KVM里面的很多makefile里面都使用到了的。既然是Windows下,那么只有下载cygwin了。

      安装cygwin的时候,记着把gcc编译器,make,grep,find等常用的工具装进去。其实你也可以下载Dev-Cpp这个工具,里面带有cygwin的gcc,make但是没有grep,find这些shell程序。所以还是应该下载一个cygwin。cygwin版本无所谓,很老的都可以。不过cygwin很大就是了。

      http://www.cygwin.org

    3. 安装JDK

      这个过程就不用我多说了,我是直接安装的JBuilder2005。

    3. make编译

         将j2me_cldc下载下来后,解压开。进入j2me_cldc\build\win32目录。里面有个makefile文件,这就是win32环境下的编译文件。

       整个过程需要在windows的命令提示符下完成,还需要设置PATH。在命令提示符下输入

       PATH=D:\CYGWIN\BIN;D:\Borland\JBuilder2005\jdk1.4\bin;%PATH%

       然后直接敲入make,就可以进行整个编译过程了。整个编译过程应该还是很顺利的。

       有可能出现"*.java 找不到"的错误,多半是因为Windows的command里面有个find.exe和cygwin\bin里面的那个find.exe冲突了,应该把cygwin\bin放在前面。

    4. 在VC6下编译KVM

       在j2me_cldc\kvm\VmWin\build下有个VC6的dsw工程文件,不过必须先经历上面的make编译后才能打开这个VC6工程文件进行编译。因为整个KVM的编译需要的两个文件nativeFunctionTableWin.c和ROMjavaWin.c是在编译执行tools\jcc后生成的,没有编译执行tools\jcc是不会有这两个文件的。

       jcc是个将Java核心的class文件的bytecodes转换成一堆C语言的数组,然后让KVM编译的时候包含进去,这些核心class的bytecodes就是放在上面两个文件里面。这样做的好处就是在KVM执行时不用在再去找核心的class文件然后装载。

    5. 测试运行一下自己编译的KVM

       编译成功的话,会生成VmWin.exe或者kvm.exe文件。你可以测试一下写个helloworld.java,不需要preverifier,就可以直接运行你的helloworld.class的。

       SUN这个j2me cldc的KVM里面已经提供了一个putchar的native function,你可以根据自己的喜好,去增加修改Java的native function。整个KVM.exe有200多K,不过代码可能只有80K多点,其它的就是Java的CLDC核心class。

      

    发表于 @ 2006年01月10日 21:33:00|评论(loading...)|编辑

    新一篇: 增加KVM中的系统调用API | 旧一篇: 经典的文章无论如何也要再次转贴(Linux内核编译过程)

    评论

    #罗蒙·迪翁 发表于2006-01-11 21:31:00  IP: 218.94.58.*
    还不错的程序。可惜JAVA还真是太慢了。
    #hellohello 发表于2006-01-14 15:15:00  IP: 202.86.165.*
    我的cygwin放在E:\cygwin和JVM放在E:\j2me_cldc,但当我编译时有这样的错误,请问我错在哪里呢?希望有人回复!
    我安装cygwin时,是选择安装所有程序的.

    make[1]: Entering directory `/cygdrive/e/j2me_cldc/tools/preverifier/build/win32
    '
    make[1]: cl: Command not found
    make[1]: *** [check_class.obj] Error 127
    make[1]: Leaving directory `/cygdrive/e/j2me_cldc/tools/preverifier/build/win32'

    make: *** [all] Error 1
    #tangl_99 发表于2006-01-14 20:50:00  IP: 220.112.178.*
    to hellohello:
    实在对不起,你的错误原因应该是没有设置VC++的环境目录.这是我这篇文章的疏忽.你到你的Visual C++的bin目录(我的是D:\Microsoft Visual Studio\VC98\Bin)下vcvars.bat的批处理文件,你先运行这个文件后,你的VC编译环境就设置好了,然后再进行编译就没有问题了。
    cl就是VC++的编译器。



    #starxit 发表于2006-03-27 17:56:00  IP: 61.134.6.*
    明白了class文件名的大小写也有关
    kvm -classpath . *
    #starxit 发表于2006-03-27 17:44:00  IP: 61.134.6.*
    我已经完成了编译,可是不知到怎么执行*.class文件,kvm可以正常执行
    #真诚的 发表于2006-06-24 16:46:00  IP: 220.248.103.*
    按照 上面说的流程 进入win32 PATH=D:\CYGWIN\BIN;D:\Borland\JBuilder2005\jdk1.4\bin;%PATH%
    MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
    Error makefile 5: Command syntax error
    Error makefile 12: Command syntax error
    Error makefile 14: Command syntax error
    Error makefile 16: Command syntax error
    Error makefile 18: Command syntax error
    Fatal makefile 31: No terminator specified for in-line file operator 解了半天也不知道原因, 大侠帮帮忙啊
    #tangl_99 发表于2006-06-24 17:59:00  IP: 220.112.178.*
    。。。。。
    你的make.exe怎么会是borland的?
    你检查一下你的cygwin,应该是cygwin\bin目录下的make.exe
    #真诚的 发表于2006-06-26 08:21:00  IP: 220.248.103.*
    非常感谢, 我发现cygwin 确实没有 make.exe, 重装有了. 编译又发现 下面这个错误. 能否再指点一下啊 ,

    F:\j2me_cldc\build\win32>make
    >>>Recursively making ../../tools/preverifier/build/win32 all...
    make[1]: Entering directory `/cygdrive/f/j2me_cldc/tools/preverifier/build/win32
    '
    make[1]: *** [check_class.obj] Error 255
    make[1]: Leaving directory `/cygdrive/f/j2me_cldc/tools/preverifier/build/win32'

    make: *** [all] Error 1
    #kvm菜鸟 发表于2006-08-19 15:20:00  IP: 211.155.21.*
    小弟 也是按照上面的流程执行下来 但是遇到这样的错误:


    link: invalid option -- o
    Try `link --help' for more information.
    make[1]: *** [preverify.exe] Error 1
    make[1]: Leaving directory `/cygdrive/d/work/3g/kvm/j2me_cldc/tools/preverifier/build/win32'
    make: *** [all] Error 1

    请斑竹指点一下 感谢啊!!!
    #SCSTOP 发表于2006-11-14 13:22:00  IP: 219.134.185.*
    你好,我kvm make通不过。请教一下怎么办?
    直接用vc编译的话,提示少了一个文件nativeFunctionTableWin.c
    查了一下资料,是jcc make后生成的
    我进入
    j2me_cldc-1_1-fcs-src-winunix\j2me_cldc\tools\jcc
    make后只生成了一个.filelist文件。
    怎么处理呢?
    谢谢!
    #tangl_99 发表于2006-11-15 13:00:00  IP: 221.237.124.*
    to SCSTOP:
    用VC编译,我也没有编译通过。
    需要在Windows上,下载一个cygwin的Linux环境下编译才行。

    nativeFunctionTableWin.c是需要在编译KVM之前生成的。
    在此之前,还需要调用javac将所有的java核心包编译成classes.zip,再编译生成jcc,再调用jcc把classes.zip转换成一个.c的文件(J2ME的核心包是直接装载在ROM的)
    然后还有编译生成preverify.exe程序。。。
    不过,这些步骤都是写在了最外面的makefile里面,总体说来,你设置要了cygiwn的环境和JDK的环境,敲入"make"命令,一切事情都自动搞定了。

    可能你们的问题都在于,你们没有一个cygwin的Linux环境。
    http://www.cygiwn.com去下一个吧。



    #bolida 发表于2007-06-21 16:27:02  IP: 220.191.185.*
    tangl_99:你好!
    由于在VC6下直接编译KVM会提示缺少两个文件,nativeFunctionTableWin.c和ROMjavaWin.c,所以我在cygwin 下编译C:\code\j2me_cldc\build\win32下的makefile以便生成这两个文件,但是会出现以下错误,求您解答,万分感谢!

    >>>Recursively making ../../tools/preverifier/build/win32 all...
    make[1]: Entering directory `/cygdrive/c/code/j2me_cldc/tools/preverifier/build/
    win32'
    make[1]: *** [check_class.obj] Error 128
    make[1]: Leaving directory `/cygdrive/c/code/j2me_cldc/tools/preverifier/build/w
    in32'
    make: *** [all] Error 1
    #tangl_99 发表于2007-06-21 16:50:18  IP: 207.46.92.*
    。。。。。。。。
    需要执行jcc来生成。


    #bolida 发表于2007-06-21 17:47:22  IP: 220.191.185.*
    不好意思tangl_99

    我还是没有明白具体要怎样执行JCC来生成,是执行tools\jcc下的makefile吗?求您能告诉我一下,万分感谢!
    #tangl_99 发表于2007-06-22 10:41:08  IP: 207.46.92.*
    其实,你如果安装好了cygwin。
    所需要做的工作,只是在总的目录下输入make
    然后里面makefile会自动调用各个目录下的makefile,执行编译,链接,然后调用jcc生成那几个ROM文件,然后最后再链接到KVM的.

    具体的操作我不记得了,你从makefile开始看起吧。

    #bolida 发表于2007-06-22 15:44:12  IP: 220.191.185.*
    多谢了, tangl_99!

    昨天的问题已经好了,是因为我VC的环境变量设置不正确!
    可是现在链接是还有问题,你能帮我看一下吗?

    >>>Recursively making ../../tools/preverifier/build/win32 all...
    make[1]: Entering directory `/cygdrive/c/code/j2me_cldc/tools/preverifier/build/
    win32'
    begin link:
    link: invalid option -- o
    Try `link --help' for more information.
    make[1]: *** [preverify.exe] Error 1
    make[1]: Leaving directory `/cygdrive/c/code/j2me_cldc/tools/preverifier/build/w
    in32'
    make: *** [all] Error 1

    我用echo打出具体的链接命令是这样的:
    begin link:
    @link check_class.obj main.obj utf.obj check_code.obj convert_md.obj util.obj jar.obj jar_support.obj classloader.obj file.obj classresolver.obj stub
    s.obj inlinejsr.obj sys_support.obj -out:preverify.exe user32.lib kernel32.lib wsock32.lib

    好像是VC的link选项不对,能给个建议吗?十分感谢!

    #tangl_99 发表于2007-06-23 11:23:30  IP: 207.46.92.*
    VC 里面不是有个vcvar32.bat的batch file,这个东西就是设置VC在命令行下的编译环境的。
    #bolida 发表于2007-06-25 15:55:43  IP: 220.191.185.*
    谢谢!
    呵呵,我已经编译通过了,也可以执行HelloWorld.class文件了。
    但我还不能在源代码中设断点来调试,好像是几个dll找不到,如果想调试还需要模拟器吗?我不是太懂J2ME。呵呵。。。
    #bolida 发表于2007-06-25 16:07:10  IP: 220.191.185.*
    噢,我知道原因了!
    不好意思!呵呵。。。
    我工程了用的是release版本。
    晕倒。。。
    #ping3021 发表于2008-01-10 14:26:46  IP: 218.78.218.*
    记着把gcc编译器,make,grep,find等常用的工具装进去
    这个本身安装里面是没有的 应该怎么安装的呢?
    #tangl_99 发表于2008-01-11 17:49:30  IP: 211.83.146.*
    怎么会没有呢?
    cygiwn有Unix/Linux大部分的软件和工具,这些常用工具都是有的。
    #polish Lao 发表于2008-02-22 12:11:04  IP: 219.135.228.*
    你好,我用cygwin 的 make 编译时 遇到了同 '真诚的' 一样错误:
    make
    >>>Recursively making ../../tools/preverifier/build/win32 all...
    make[1]: Entering directory `/cygdrive/f/j2me_cldc/tools/preverifier/build/win32
    '
    make[1]: *** [check_class.obj] Error 255
    make[1]: Leaving directory `/cygdrive/f/j2me_cldc/tools/preverifier/build/win32'

    make: *** [all] Error 1

    可以说说怎样才可以用 cygwin 成功编译吗??
    You will be appreciated.
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © tangl_99