导读:
20071029 java cldc uclinux
http://www.shengfang.org
移植KVM到arm-linux(1)
http://jayya.com/?p=109
KVM在嵌入式Linux上的移植
http://blog.csdn.net/zht_sir/archive/2007/06/03/1636342.aspx
http://dev.csdn.net/author/fyzhao/3ee7494bceb94997bf418b42a8bd009a.htmlKVM本身只带有cldc1.1的类库,功能十分简单,不能满足用户的需求,本篇介绍如何对KVM进行扩展。
对KVM进行扩展,在Java层十分简单,只要向在编译Java代码时多加一个文件就可以,没什么要说的,麻烦的是如果在加入的Java类中有本地操作该怎么办?本地的C语言代码放在哪里编译才能够供KVM调用?
答案是KNI。下面就以KNI为主要内容介绍如何对KVM加以扩展,在最后附加一个具体的实现例子。
1. KNI的特点:
KNI(K Native Interface)是SUN的KVM(K Virtual Machine)所使用的本地方法调用机制。
JNI(Java Native Interface)是已经为我们所熟悉的Java本地方法调用机制,JNI一般使用在J2SE或J2EE平台上,本地方法被编进动态链接库,在运行时由Java虚拟机载入。
KVM中也需要本地调用,但JNI是“重量级”的本地调用方式,在使用时消耗的资源较多,所以针对KVM设计出了KNI,KNI被称为是JNI的一个简化版,是“轻量级”的本地调用方式。KVM不能加载动态链接库,所以在KNI机制下,本地方法不是写在库中,而是编入虚拟机内部。
以下是KNI与JNI最重要的一些区别:
KNI是“实现层”的API,即它是虚拟机实现的一部分,修改KNI的API就要重新编译虚拟机,这些API的细节对于Java程序员来说是不可见的;而JNI的API是在运行时动态加载进来的,它的修改与虚拟机无关,JNI的API对于Java程序员来说是可见的。
KNI的函数建在虚拟机内部,只能为此虚拟机所独享;而JNI的函数放在动态链接库中,可以为多个虚拟机共用。
由于在虚拟机内部,KNI的很多操作方式与虚拟机有关,在传递参数和控制对象的时候都要先经过一些特别的处理;JNI的调用方式比较直接,但可能会增加安全隐患。
KNI是JNI的简化版,功能也会弱一些,它不能创建对象,也不能调用Java层的方法。
总之,“在虚拟机内部”是KNI所有特点的根源,记得这一点,KNI的所有内容都非常容易理解。
KVM Porting 指南
4。KVM源码概览
4.1目录结构概览
解压KVM包后,在你的目录下生成如下子目录。(假定父目录为j2me_cldc1.0.3)
目录j2me_cldc1.0.3:
■api-Java类库源码
■bin-可执行文件,编译的类库
■build-编译用的makefile
■docs-说明文件
■jam-JAM(Java Application Manager)源码
■kvm-KVM源码
■samples-试例程序源码
■tools-辅助工具的源码(如JavaCodeCompact, preverifier,kdp,palm tool等)
目录j2me_cldc1.0.3kvm:
■VmCommon-所有公用的,平台无关的KVM源码都在该目录下
■VmExtra-公用的,可选的组件的源码
■VmUnix-针对Unix
■VmWin-针对Windows
目录j2me_cldc1.0.3kvmVmCommon:(所有公用的,平台无关的KVM源码)
■h-include文件
■src-源码
注:当你要port时,可以把你自己平台相关的源码置于kvm目录之中。例如我要port到W
inCE我可以这样安排我的源码(kvmVmWinCEsrc-我的源码,kvmVmWinCEh-我的头
文件,kvmVmWinCEuild-我的makefile)。
4.2 KVM源码功能简述
在j2me_cldc1.0.3kvmVmCommonsrc和j2me_cldc1.0.3kvmVmCommonh中包含了K
VM所有公用的,平台无关的源码和头文件,如下表所示:
------------------------------------
File Description
------------------------------------
StartJVM.c VM的启动和命令行的读取
bytecodes.c Java bytecodes的定义,自KVM1.0.2后,bytecode解释器被从新设
计,这部分从interpret.c分离出来。你可以定制VM,使用这里定义的bytecode的子集或
超集。
cache.h 内联缓存(inlinecaching)的支持,用以加快方法检索(
cache.c method lookup)的速度,并支持"fast" bytecodes.(注:关于m
ethodlookup请参考JLS15.12.4)
class.h 运行时java类的内部数据结构和操作
class.c
events.h 实现事件处理系统
events.c
execute.h 解释器的执行宏和操作
execute.c
fields.h 用以存储不同类型的域(field)的运行时内部结构。当一个
fields.c 新类被载入VM时,就会生成一张由这些域组成的表。
frame.h 定义栈帧(stack frame)和异常处理(exceptionhandling )的
操作。
frame.c
garbage.h 垃圾处理器和内存管理。
garbage.c
collector.c
collectorDebug.c
global.h 大量全局变量的定义
global.c
hashtable.h 实现VM内部使用的哈希表
hashtable.c
interpret.h bytecode解释器。
interpret.c
loader.h 类载入器。
loader.c
log.h 记录并输出运行时VM的诊断信息
log.c
long.h 处理64bit运算的特殊的宏
main.h 编译的选项及系统的预制设定。
messages.h 错误与警告信息
native.h JVM所需的native函数和核心native库,注意,KVM是不使用
native.c JNI(Java Native Interface)的,JNI对小设备来说开销太大了。
nativeCore.c
pool.h 常量池(Constant pool)的管理。
pool.c
profiling.h 用以描述VM的执行的数据声明与操作
profiling.c
property.h 取得Java系统特性的操作。
property.c
rom.h ROMizer(JavaCodeCompact tool) 所需的宏.
runtime.h 平台特有的操作的函数原型定义,注意这里定义的函数通过一个r
untime_md.c来实现。这也就是说runtime_md.c是建立在你想要port的平台特性之上的。
stackmap.c Stackmap操作用于支持额外的垃圾收集。
thread.h 多线程的支持与java的线程管理。
thread.c
verifier.h 类文件审核器
verifier.c
增加KVM中的系统调用API
http://kaober.spaces.live.com/
在Palm开发JAVA程式的心得
http://bbs.ustc.edu.cn/cgi-bin/bbsanc?path=/groups/GROUP_4/Java/D900879D8/D7BE53F98/M.1933.A
KVM Porting 指南⑵
http://www.zixi.net/article/show.asp?id=37082&Page=2
本文转自
http://www.shengfang.org/blog/p/20071029javacldcuclinux.php