Java SWT浏览器xulrunner崩溃Java VM

时间:2012-12-19 20:09:39

标签: java browser swt embedding xulrunner

我正在基于Swing的应用程序中嵌入基于Xulrunner的SWT浏览器,使用正确的路径和设置SWT.MOZILLA。主要是我有一个扩展JPanel的课程。这个类嵌入了一个带有Browser小部件的shell。如果我创建的不只是Java VM类崩溃的一个实例,则会终止整个应用程序。如果我用SWT.NONE创建浏览器(所以基本上拿起系统的浏览器)我可以在我的应用程序中显示我想要的浏览器数量。 问题出在哪里?

顺便说一句,nsCycleCollector.c(xulrunner的一部分)导致虚拟机崩溃。

2 个答案:

答案 0 :(得分:0)

很难自己编写SWT / AWT(Swing)桥接器。我目前正在使用DJNative,它完美无缺。请试一试;)

拥有SWT浏览器的XULRunner

  1. 首先从mozilla下载xulrunner运行时。
  2. 在任何地方提取它并记住应用程序引导期间的路径
  3. 设置以下系统属性org.eclipse.swt.browser.XULRunnerPath 通过xulrunner安装的路径
  4. 使用该方法,您可以使用您的应用程序发送预定义的xulrunner安装。

答案 1 :(得分:0)

我在这里遇到了同样的崩溃情况。

如果使用xulrunner 10.0.4esr,则在JVM中止之前获得此System.err输出:

###!!! ABORT: Main-thread-only object used off the main thread: file e:/builds/moz2_slave/rel-m-esr10-xr-w32-bld/build/xpcom/base/nsCycleCollector.cpp, line 1278

我发现你需要销毁nsIWebBrowser实例的nsIBaseWindow来清理东西:

nsIWebBrowser webBrowser = (nsIWebBrowser)b.getWebBrowser();
nsIBaseWindow baseWindow = (nsIBaseWindow)webBrowser.queryInterface(nsIBaseWindow.NS_IBASEWINDOW_IID);
baseWindow.destroy();

执行此操作后,您可以在其中创建包含Mozilla / xul的SWT浏览器的新实例。

promlem是,你不能再访问nsInterfaces了(因为Browser.getWebBrowser()返回null)!

有没有办法在xulrunner 10或24上以编程方式获取该nsIBaseWindow对象?

这是崩溃日志中的一个片段(使用xulrunner 24和JDK6运行时生成):

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [xul.dll+0xaa1b4c]  NS_CycleCollectorSuspect2+0xc
C  [xul.dll+0x6d45d1]  xpc_ActivateDebugMode+0x1a588
C  [xul.dll+0x6d1192]  xpc_ActivateDebugMode+0x17149
C  [xul.dll+0xa74003]  JSD_GetValueForObject+0x2b8625
C  [xul.dll+0xa72ffa]  JSD_GetValueForObject+0x2b761c
C  [xul.dll+0x70fdae]  xpc_ActivateDebugMode+0x55d65
C  [xul.dll+0x711bc6]  xpc_ActivateDebugMode+0x57b7d
C  [swt-xulrunner-win32-4426.dll+0x11d6]  Java_org_eclipse_swt_internal_mozilla_XPCOM__1VtblCall__II+0xe
j  org.eclipse.swt.internal.mozilla.XPCOM.VtblCall(II)I+9
j  org.eclipse.swt.internal.mozilla.nsIBaseWindow.Create()I+9
j  org.eclipse.swt.browser.MozillaDelegate.createBaseWindow(Lorg/eclipse/swt/internal/mozilla/nsIBaseWindow;)I+1
j  org.eclipse.swt.browser.Mozilla.initWebBrowserWindows()V+184
j  org.eclipse.swt.browser.Mozilla.create(Lorg/eclipse/swt/widgets/Composite;I)V+665
j  org.eclipse.swt.browser.Browser.<init>(Lorg/eclipse/swt/widgets/Composite;I)V+81
j  XulTest$1.run()V+47