Браузер Java SWT xulrunner аварийно завершает работу Java VM

Я встраиваю в приложение на основе Swing браузер SWT на основе Xulrunner, используя правильный путь и настройку SWT.MOZILLA. В основном у меня есть класс, который расширяет JPanel. Этот класс встраивает оболочку с виджетом браузера внутри. Если я создам более одного экземпляра класса Java VM, произойдет сбой всего приложения. Если я создаю браузер с помощью SWT.NONE (по сути, выбирая браузер системы), я могу отображать в своем приложении столько браузеров, сколько захочу. В чем проблема?

Кстати, именно nsCycleCollector.c (часть xulrunner) приводит к сбою виртуальной машины.


person neo    schedule 19.12.2012    source источник
comment
Итак, вы действительно должны использовать SWT.MOZILLA?   -  person Baz    schedule 20.12.2012
comment
Ну, я хочу xulrunner, а не системный браузер... Мне нужен такой же экземпляр браузера для Windows/OSX/GNU/Linux. Я также хочу специальный браузер без файлов cookie или истории из соображений безопасности. С SWT.NONE я буду делиться своей информацией с системным браузером, который пользователь обычно использует для серфинга в Интернете. Не уверен, что я правильно объяснил. Извините за мой английский!   -  person neo    schedule 20.12.2012


Ответы (2)


Самостоятельно запрограммировать мост SWT/AWT(Swing) сложно. В настоящее время я использую для этого DJNative, и он отлично работает. Пожалуйста, попробуйте ;)

Собственная установка XULRunner для браузера SWT

  1. Сначала загрузите среду выполнения xulrunner из Mozilla.
  2. извлеките его куда угодно и запомните путь во время начальной загрузки вашего приложения.
  3. установите следующее системное свойство org.eclipse.swt.browser.XULRunnerPath с путем к вашей установке xulrunner

при таком подходе вы можете отправить предопределенную установку xulrunner вместе с вашим приложением.

person Johann Sonntagbauer    schedule 13.01.2013
comment
Спасибо! Я уже сделал это, но когда я запускаю второй браузер, виртуальная машина Java просто жестоко падает. Это странно, потому что, если я использую опцию SWT.NONE, все проходит без проблем. Единственная проблема заключается в том, что каждая машина с Windows XP (даже с пакетом обновления 3) будет иметь необычайно красивый Internet Explorer 8, который устарел и не соответствует стандартам. - person neo; 24.01.2013
comment
Вы можете проверить, был ли создан файл hs_err, и опубликовать его? - person Johann Sonntagbauer; 24.01.2013

У меня такая же ситуация с аварией.

Если вы используете xulrunner 10.0.4esr, вы получите этот вывод System.err до прерывания работы JVM:

###!!! 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

Я узнал, что вам нужно будет уничтожить nsIBaseWindow экземпляра nsIWebBrowser, чтобы очистить вещи:

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

После этого вы можете создавать новые экземпляры браузера SWT с Mozilla/xul.

Проблема в том, что вы больше не можете получить доступ к nsInterfaces (поскольку Browser.getWebBrowser() возвращает null)!

Есть ли способ программно добраться до этого объекта nsIBaseWindow на xulrunner 10 или 24?

Вот фрагмент из журнала сбоев (сгенерированный с помощью 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
person Gerrit Volkenborn    schedule 19.05.2014