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的版本中出现了。