几天以来在网上查资料终于有了成效,现在介绍给大家,希望有所帮助:
Java-COM桥接
由于我们需要使用Web浏览器显示在自己的框架里,所以在本系统中要实现一个Web浏览器。实现Web浏览器的最方便的方法,是使用微软公司的Internet Explore控件。但是,由于Java语言的平台无关性,在Java环境中使用像Internet Explore这样的控件是比较麻烦的,需要复杂的JNI(Java本地调用)编程。
为了解决这个问题,通过在世界最大的开放源代码平台http://www.sourceforge.net上的搜索,我们发现,有一个JaWin的项目,就是致力于实现Java到COM(公共对象模型,Component Object Model;Internet Explore控件就是一种COM控件)的桥接的。但是,该项目不能实现图形界面的自动处理。
幸运的是,通过进一步的搜索,我们发现,一位德国程序员(参考文献[5])在JaWin的基础上发展了一套完整的Java应用程序集成COM的通用方式,并可实现COM组件的可视化,并命名之为NJaWin(New JaWin)。
如果我们不太在意程序的跨平台能力并只需要在Windows平台下进行工作的话,可以使用NjaWin这种Java-COM桥来实现从Java程序到COM组件的连接。Java-COM桥使用JNI(Java 本地调用)规范与COM接口。
Java-COM桥使用通用接口将Java应用对COM的请求转发到本地DLL上,再由DLL实现对COM的调用。NJaWin完全实现了通用的Java到COM的调用接口和回调方法,并支持COM Visibility(COM 可视化),从而完全可以实现我们的要求;NJaWin目前是自由软件,比较适合个人和教育等领域的应用。
NJaWin的工作流程为:
1. 使用JCOMJen.exe对COM控件生成派发接口(dispatch interface)和stub存根。
派发接口负责将Java应用程序对COM的调用转换为对本地动态连接库jawin.dll的相应调用,而stub则为回调方法接口。同时生成的还有代表对应COM对象的一个类(CoClass)。
JCOMJen的参数如下图2所示,对于我们的问题来说,Real Player对应的COM为一个RealAudio控件,一般在Windows安装目录的System32子目录下,文件名为shdocvw.dll;另一个参数为我们Java应用的包(package)名(可选)。
2. 使用一个AXComponent子类来实现COM接口。
AXComponent实际上是一个Canvas Component,即Java中的AWT“画板”,为Java的“重型”(本地)图形组件,拥有GUI的COM将在这个类的实例上渲染图形,我们可以将它放置在任何Java GUI容器(例如JFrame或JPanel)中;在GUI的设计中还需要注意,AWT的重型组件总是在Swing的轻型组件前面渲染,因此不可能在AXComponent上面放置其他的Swing组件。下面是对SHDocVw(Internet控件)的实现片段:
public class WebBrowserComponent extends AXComponent {
public IWebBrowser2 control;
/** 构造函数,在生成此浏览器控件的实例时调用 */
public WebBrowserComponent(Object parent) throws COMException {
super(SHDocVw.IWebBrowser2.proxyIID);
}
public void initInstance() throws COMException {
control = new IWebBrowser2(getControl());
}
/* 浏览URL的函数 */
public void Navigate(java.lang.String URL) throws COMException {
control.Navigate(URL);
}
在上面的例子中,包含了一个Navigate函数,该函数可以使用Web浏览器的功能实现对URL访问。
这种方法不仅可以用于弥补Java在本地(即Windows操作系统上)的功能不足,更可以快捷方便地利用已有的大量COM组件大大地提高Win32平台下Java程序设计的效率,但不可避免地影响程序的可移植性,研发人员需要在这两者之间进行权衡。
具体例子在njawin中有详细介绍!