xpcom java_[Mozilla] JavaXPCOM 的jar 包概述

在mozilla 的官方网站上发现,在xulrunner 2.0 以后,将不会对javaxpcom 进行支持。(目前,mozilla 正在寻找个人来支持javaxpcom)。

在SWT 中的browser 中,可以使用mozilla 浏览器,而且可以通过mozilla 得到javaxpcom 的对象,来进一步操作浏览器。

在SWT 中的Mozilla 类中:

public Object getWebBrowser () {

if ((browser.getStyle () & SWT.MOZILLA) == 0) return null;

if (webBrowserObject != null) return webBrowserObject;

try {

Class clazz = Class.forName ("org.mozilla.xpcom.Mozilla"); //$NON-NLS-1$

Method method = clazz.getMethod ("getInstance", new Class[0]); //$NON-NLS-1$

Object mozilla = method.invoke (null, new Object[0]);

method = clazz.getMethod ("wrapXPCOMObject", new Class[] {Long.TYPE, String.class}); //$NON-NLS-1$

webBrowserObject = method.invoke (mozilla, new Object[] {new Long (webBrowser.getAddress ()), nsIWebBrowser.NS_IWEBBROWSER_IID_STR});

/*

* The following AddRef() is needed to offset the automatic Release() that

* will be performed by JavaXPCOM when webBrowserObject is finalized.

*/

webBrowser.AddRef ();

return webBrowserObject;

} catch (ClassNotFoundException e) {

} catch (NoSuchMethodException e) {

} catch (IllegalArgumentException e) {

} catch (IllegalAccessException e) {

} catch (InvocationTargetException e) {

}

return null;

}

可以看到,这里通过java 的反射来得到org.mozilla.xpcom.Mozilla 类的。而这个类在xulrunner-sdk/lib/MozillaGlue.jar 中

在org.mozilla.xpcom.Mozilla 类中,你可以看到如下的代码:

Class localClass1 = Class.forName("org.mozilla.xpcom.internal.MozillaImpl", true, localURLClassLoader);

this.mozilla = ((IXPCOMError)localClass1.newInstance());

Class localClass2 = Class.forName("org.mozilla.xpcom.internal.GREImpl", true, localURLClassLoader);

this.gre = ((IGRE)localClass2.newInstance());

Class localClass3 = Class.forName("org.mozilla.xpcom.internal.XPCOMImpl", true, localURLClassLoader);

this.xpcom = ((IXPCOM)localClass3.newInstance());

Class localClass4 = Class.forName("org.mozilla.xpcom.internal.JavaXPCOMMethods", true, localURLClassLoader);

this.jxutils = ((IJavaXPCOMUtils)localClass4.newInstance());

可以看到,主要是加载org.mozilla.xpcom.internal.MozillaImpl,org.mozilla.xpcom.internal.JavaXPCOMMethods 等类。而这些类就在xulrunner-sdk/bin/javaxpcom.jar 中。

在查看org.mozilla.xpcom.internal.JavaXPCOMMethods 类,就会发现其中加载:javaxpcomglue.dll

System.load(str1 + System.mapLibraryName("javaxpcomglue"));

这个javaxpcomglue.dll 在xulrunner-sdk/bin/ 中。

经过这些步骤,就可以使用javaxpcom 了。

思考:java 对象和 c/c++ 是怎么转换的呢?就是我们这里只是用MozillaInterfaces.jar(这个jar 都是接口),这么映射到真正干活的对象上的呢?

猜测: 这里,我们应该查看MozillaGlue.jar 中的IJavaXPCOMUtils 接口:

public abstract interface IJavaXPCOMUtils

{

public abstract long wrapJavaObject(Object paramObject, String paramString);

public abstract Object wrapXPCOMObject(long paramLong, String paramString);

}

在这个接口中,完成类对象和本地方法的映射。你调用接口,就能干活了。

总结: 综上所述,xulrunner 中关于javaxpcom 的jar/dll 应该包括:MozillaInterfaces.jar,MozillaGlue.jar,javaxpcom.jar,javaxpcomglue.dll。其中MozillaInterfaces 提供API 接口。要是xulrunner 不在提供javaxpcom 的支持,那么这些包应该不会在2.0的版本中出现了。