作为由 5 个部分组成
![](/icons/92916de.gif)
系列文章
![](/icons/92916de.gif)
第 3部分
![](/icons/92916dou.gif)
这篇文章较详细地介绍了 Harmony 项目中
![](/icons/92916de.gif)
虚拟机接口(VMI)
![](/icons/92916dou2.gif)
为什么需要 Harmony 虚拟机接口(VMI)
Java 规范标准已经定义了
![](/icons/92916yi.gif)
些虚拟机
![](/icons/92916de.gif)
API
![](/icons/92916dou.gif)
比如 Java 本地接口(JNI)
![](/icons/92916dou.gif)
Java 虚拟机工具接口(JVMTI)等
![](/icons/92916dou.gif)
但是 Java 规范标准并没有定义类库和虚拟机的间
![](/icons/92916de.gif)
接口
![](/icons/92916dou2.gif)
Harmony 为了模块化和可移植性
![](/icons/92916de.gif)
要求
![](/icons/92916dou.gif)
定义了虚拟机接口(VMI)
![](/icons/92916dou2.gif)
VMI
![](/icons/92916de.gif)
存在
![](/icons/92916dou.gif)
使 Harmony
![](/icons/92916de.gif)
Class Lib 和虚拟机
![](/icons/92916de.gif)
分离成为了可能
![](/icons/92916dou2.gif)
只要实现了该接口
![](/icons/92916de.gif)
虚拟机
![](/icons/92916dou.gif)
就可以和 Harmony
![](/icons/92916de.gif)
类库兼容
![](/icons/92916dou.gif)
可以和 Harmony
![](/icons/92916de.gif)
类库实现互操作
![](/icons/92916dou.gif)
并且可以和 Harmony 提供
![](/icons/92916de.gif)
Java 启动
![](/icons/92916chengxu.gif)
(launcher)协作
![](/icons/92916dou2.gif)
基于这种设计
![](/icons/92916dou.gif)
Harmony 除了实现大量类库代码的外
![](/icons/92916dou.gif)
已经有了 J9VM
![](/icons/92916dou.gif)
DRLVM
![](/icons/92916dou.gif)
StableVM 等等相兼容
![](/icons/92916de.gif)
虚拟机
![](/icons/92916dou.gif)
并有了很好
![](/icons/92916de.gif)
运作
![](/icons/92916dou2.gif)
什么是 VMI
本系列
![](/icons/92916de.gif)
上
![](/icons/92916yi.gif)
篇“研究 Port Layer”中提到过
![](/icons/92916dou.gif)
开发 Java 类库必须编写本地代码以使用操作系统
![](/icons/92916diaoyong.gif)
![](/icons/92916dou.gif)
并且介绍了如何利用 Harmony Port Library 开发平台无关
![](/icons/92916de.gif)
本地代码
![](/icons/92916dou2.gif)
那么如何从 Java 类库中
![](/icons/92916diaoyong.gif)
这些本地代码呢?虚拟机接口(Virtual Machine Interface)就是这样
![](/icons/92916yi.gif)
道窗户
![](/icons/92916dou.gif)
沟通了 Java 世界和本地机器
![](/icons/92916dou2.gif)
Apache Harmony 虚拟机接口分为 3个部分
![](/icons/92916dou.gif)
![](/icons/92916yi.gif)
部分是 Java 语言接口
![](/icons/92916dou.gif)
由 23 个内核类(Kernel Class)组成
![](/icons/92916dou.gif)
另
![](/icons/92916yi.gif)
部分是 C 语言接口
![](/icons/92916dou.gif)
由 10 个
![](/icons/92916hanshu.gif)
组成
![](/icons/92916dou.gif)
最后
![](/icons/92916yi.gif)
部分就是标准 JNI
![](/icons/92916dou2.gif)
最重要
![](/icons/92916de.gif)
![](/icons/92916dou.gif)
也是最早提出
![](/icons/92916de.gif)
VMI 就是 Java 1.0 时代就存在
![](/icons/92916de.gif)
Java 本地接口(Java Native Interface, JNI)
![](/icons/92916dou2.gif)
JNI 是这样
![](/icons/92916yi.gif)
种
![](/icons/92916de.gif)
编程标准:它不仅能够将本地
![](/icons/92916hanshu.gif)
内嵌入 Java 过程的中;还能从本地
![](/icons/92916chengxu.gif)
![](/icons/92916dou.gif)
例如由 C 语言编写
![](/icons/92916de.gif)
标准 win32
![](/icons/92916chengxu.gif)
创建 Java 虚拟机并使用 Java 功能
![](/icons/92916dou2.gif)
JNI 是强大
![](/icons/92916de.gif)
![](/icons/92916dou.gif)
它使 Java 具有了同本地代码
![](/icons/92916yi.gif)
样全面
![](/icons/92916de.gif)
操纵系统
![](/icons/92916de.gif)
能力;它提高了 Java 系统
![](/icons/92916de.gif)
运行效率:如果目前
![](/icons/92916de.gif)
Java
![](/icons/92916dou.gif)
在
![](/icons/92916yi.gif)
些特定场合
![](/icons/92916dou.gif)
执行速度还不能像本机代码那样令人满意
![](/icons/92916de.gif)
话;它使 Java 系统能够继续利用业已存在
![](/icons/92916de.gif)
本地代码库
![](/icons/92916dou.gif)
使得遗留系统向 Java 系统
![](/icons/92916de.gif)
迁移不那么痛苦
![](/icons/92916dou2.gif)
但是 JNI 也有其显著
![](/icons/92916de.gif)
缺点:
![](/icons/92916chengxu.gif)
不再是“100%
![](/icons/92916de.gif)
纯 Java”了
![](/icons/92916dou.gif)
牺牲了代码
![](/icons/92916de.gif)
可移植性——开发人员必须为这些
![](/icons/92916chengxu.gif)
在区别平台上
![](/icons/92916de.gif)
部署进行再测试和再调试
![](/icons/92916dou2.gif)
此后
![](/icons/92916dou.gif)
又提出了 JVMPI(Java Virtual Machine Profiler Interface)和 JVMDI(Java Virtual Machine Debug Interface)
![](/icons/92916dou2.gif)
JVMPI 是居于 Java 虚拟机和记录代理的间
![](/icons/92916de.gif)
![](/icons/92916yi.gif)
个
![](/icons/92916hanshu.gif)
![](/icons/92916diaoyong.gif)
接口:Java 虚拟机利用 JVMPI 通知记录代理虚拟机内部
![](/icons/92916de.gif)
事件:如启动线程
![](/icons/92916dou.gif)
堆分配等等;而记录代理又可以在回调
![](/icons/92916hanshu.gif)
中控制 Java 虚拟机
![](/icons/92916de.gif)
行为
![](/icons/92916dou2.gif)
JVMDI 同样是
![](/icons/92916yi.gif)
个
![](/icons/92916hanshu.gif)
接口
![](/icons/92916dou.gif)
和 JVMPI 区别
![](/icons/92916de.gif)
是
![](/icons/92916dou.gif)
JVMDI 主要是提供调试器以及其他工具
![](/icons/92916yi.gif)
个监测以及控制 Java 虚拟机内部状态
![](/icons/92916de.gif)
编程接口
![](/icons/92916dou2.gif)
这是由于 JVMPI 和 JVMDI 的间
![](/icons/92916de.gif)
相似性
![](/icons/92916dou.gif)
随着 Java 5
![](/icons/92916de.gif)
推出
![](/icons/92916dou.gif)
出现了
![](/icons/92916yi.gif)
个用来取代上述两者
![](/icons/92916de.gif)
![](/icons/92916dou.gif)
更为统
![](/icons/92916yi.gif)
![](/icons/92916de.gif)
虚拟机接口:JVMTM Tool Interface (JVMTI)
![](/icons/92916dou2.gif)
JVMTI 功能更为强大
![](/icons/92916dou.gif)
不仅局限于 JVMPI 和 JVMDI
![](/icons/92916de.gif)
所有功能
![](/icons/92916dou2.gif)
事实上
![](/icons/92916dou.gif)
Harmony 项目
![](/icons/92916de.gif)
instrument 模块就是利用 JVMTI 实现
![](/icons/92916de.gif)
![](/icons/92916dou2.gif)
Harmony
![](/icons/92916de.gif)
VMI 还包括内核类
![](/icons/92916dou2.gif)
内核类
![](/icons/92916de.gif)
提出是
![](/icons/92916yinwei.gif)
少数核心
![](/icons/92916de.gif)
公共类是和虚拟机密切相关(VM-spec
![](/icons/92916if.gif)
ic)
![](/icons/92916de.gif)
![](/icons/92916dou.gif)
它们都是属于 java.lang、java.lang.ref、java.lang.reflect 和 java.security 等几个核心
![](/icons/92916de.gif)
包
![](/icons/92916dou.gif)
比如说 java.lang.ClassLoader、 java.lang.ref.WeakReference 等
![](/icons/92916dou2.gif)
随着 Java 版本
![](/icons/92916de.gif)
升级
![](/icons/92916dou.gif)
核心类
![](/icons/92916de.gif)
数量也可能会增加
![](/icons/92916dou2.gif)
Harmony
![](/icons/92916de.gif)
类库实现为大多数核心类定义了实现模板
![](/icons/92916dou2.gif)
VM
![](/icons/92916de.gif)
开发人员可以从零开始实现这些核心类
![](/icons/92916dou.gif)
也可以在 Harmony 提供
![](/icons/92916de.gif)
模板基础上开始开发
![](/icons/92916dou2.gif)
Harmony 项目定义了自己
![](/icons/92916de.gif)
虚拟机接口 VMI
![](/icons/92916dou.gif)
它和传统虚拟机结构兼容
![](/icons/92916dou.gif)
实现了 JNI 和 JVMTI;事实上
![](/icons/92916dou.gif)
Harmony VMI 更为强大:VMI 能够提供 Port Layer 支持
![](/icons/92916dou.gif)
从而使 JNI 具有跨平台能力;还有另
![](/icons/92916yi.gif)
些虚拟机提供者可选
![](/icons/92916de.gif)
![](/icons/92916hanshu.gif)
接口
![](/icons/92916dou.gif)
具有更强
![](/icons/92916de.gif)
扩展性
![](/icons/92916dou2.gif)
不仅如此
![](/icons/92916dou.gif)
Harmony VMI 还是 Harmony 项目
![](/icons/92916de.gif)
核心
![](/icons/92916dou.gif)
它联系了项目
![](/icons/92916de.gif)
最主要
![](/icons/92916de.gif)
3大模块:类库、虚拟机和 Port Layer
![](/icons/92916dou2.gif)
Harmony VMI
![](/icons/92916de.gif)
特点
可移植性
和以往
![](/icons/92916de.gif)
本地代码会引入平台相关性区别
![](/icons/92916dou.gif)
Harmony VMI 提供了 Port Library
![](/icons/92916dou.gif)
只要
![](/icons/92916chengxu.gif)
人员在本地代码中使用 Port
![](/icons/92916hanshu.gif)
而不是直接
![](/icons/92916diaoyong.gif)
操作系统 API
![](/icons/92916dou.gif)
就能保持 Java 项目
![](/icons/92916de.gif)
可移植性
![](/icons/92916dou2.gif)
这
![](/icons/92916yi.gif)
点不仅对于 Harmony 类库
![](/icons/92916de.gif)
开发者是重要
![](/icons/92916de.gif)
![](/icons/92916dou.gif)
而且对于 Java 应用
![](/icons/92916chengxu.gif)
员来说
![](/icons/92916dou.gif)
Harmony VMI
![](/icons/92916de.gif)
这个特点使他们能够充分利用 JNI/JNTI
![](/icons/92916de.gif)
强大力量而不必担心要在区别平台上调试同
![](/icons/92916yi.gif)
![](/icons/92916chengxu.gif)
所带来
![](/icons/92916de.gif)
麻烦
![](/icons/92916dou2.gif)
至于 Harmony 项目利用 Port Library 屏蔽平台差异性
![](/icons/92916de.gif)
过程
![](/icons/92916dou.gif)
在本系列
![](/icons/92916de.gif)
上
![](/icons/92916yi.gif)
篇中我们已经详细描述了
![](/icons/92916dou.gif)
这里不再赘述
![](/icons/92916dou2.gif)
模块化
Harmony 项目从
![](/icons/92916yi.gif)
开始
![](/icons/92916dou.gif)
就把模块化作为设计
![](/icons/92916de.gif)
主要目标的
![](/icons/92916yi.gif)
![](/icons/92916dou2.gif)
组件的间
![](/icons/92916de.gif)
依赖存在于接口的间
![](/icons/92916dou.gif)
而不是模块
![](/icons/92916de.gif)
实现的间
![](/icons/92916dou2.gif)
只要是
![](/icons/92916yi.gif)
个符合 Java Class File Format
![](/icons/92916de.gif)
类文件
![](/icons/92916dou.gif)
就能运行在各个 Java 虚拟机上;所有
![](/icons/92916de.gif)
本地代码
![](/icons/92916dou.gif)
只要其
![](/icons/92916diaoyong.gif)
符合 VMI 规范标准
![](/icons/92916dou.gif)
就能获得各个 Java 虚拟机
![](/icons/92916de.gif)
支持;而区别
![](/icons/92916de.gif)
Port Layer 实现
![](/icons/92916dou.gif)
只要实现 struct HyPortLibrary 定义
![](/icons/92916de.gif)
各个虚
![](/icons/92916hanshu.gif)
![](/icons/92916dou.gif)
就能满足所有本地代码
![](/icons/92916de.gif)
系统
![](/icons/92916diaoyong.gif)
![](/icons/92916dou2.gif)
希望能够将 A 组织提供
![](/icons/92916de.gif)
类库
![](/icons/92916dou.gif)
运行在 B 厂商
![](/icons/92916de.gif)
Java 虚拟机上
![](/icons/92916dou.gif)
而本地代码
![](/icons/92916diaoyong.gif)
又是通过 C 个人实现
![](/icons/92916de.gif)
Port Library 进行
![](/icons/92916de.gif)
![](/icons/92916dou2.gif)
事实上
![](/icons/92916dou.gif)
Harmony
![](/icons/92916de.gif)
类库已经能够运行在 IBM J9 虚拟机或者 DRLVM 虚拟机上
![](/icons/92916dou.gif)
Harmony Port Library 也有潜在
![](/icons/92916de.gif)
候选者
![](/icons/92916dou2.gif)
![](http://www.crazycoder.cn/WebFiles/20091/4dde1483-7e19-40b7-81b6-72ba03471594.jpg)
,f_port);
延伸阅读
最新评论