Bonjour,
Je développe une application basée sur Eclipse RCP 3.8.2 à base de SWT... (Java 7.0_21/ Windows 7).
Cette application affiche dans un tabfolder différentes vues qui contiennent un browser.
Auparavant chaque browser était un browser SeaMonkey embarquant le moteur de rendu Gecko que nous avions adapté.
Gecko ne pouvant plus être modifié, nous avons décidé d'utiliser, comme beaucoup un browser Chromium.
Pour ce faire nous utilisons Chromium Embedded Framework 3 (CEF3), et nous intégrons l'exemple JCEF fourni avec la version 1916_1804.
L'architecture est la suivante :
Le browser javacef charge une DLL JCEF qui offre une API JNI et est elle même linkée avec la bibliothèque CEF (libcef_dll_wrapper et libcef).
Le code Java communique avec la DLL via des handlers Java qui ont leur correspondant handler C++
La DLL communique avec Java via des callbacks C++ qui appellent les méthodes adhoc.
......
Le moteur CEF est initialisé une fois dans un thread indépendant (cefInitialize)
Une boucle de message CEF est instanciée CefDoMessageLoopWork().
Dans la mesure du possible, nous voudrions conserver le code de JCEF qui est fonctionnel et pouvoir l'intégrer à notre application.
Or JCEF est basé sur AWT/OpenGL 2 et notre application sur SWT (bibliothèque jogl et gluegen-rt).
Nous avons trouvé une façon d'intégrer le code à du SWT. Nous créons un Canvas SWT
puis nous initialison GL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Canvas swtCanvas = new Canvas(composite, SWT.EMBEDDED); swtCanvas.setLayout(new FillLayout());
Nous créons une Frame AWT et la mettons dans notre Canvas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 GLProfile glprofile = GLProfile.getDefault(); GLCapabilities glcapabilities = new GLCapabilities(glprofile); canvas_ = new GLCanvas(glcapabilities) { @Override public void paint(Graphics g) { if (parent_ != null) { createDevTools(parent_, clientHandler_, getWindowHandle(), isTransparent_, null); } else { createBrowser(clientHandler_, swtCanvas.handle, url_, isTransparent_, null, context_); } super.paint(g); } };
puis nous integrons le canvas GL
Code : Sélectionner tout - Visualiser dans une fenêtre à part Frame frame = SWT_AWT.new_Frame(swtCanvas);
Sur cette dernière instruction, notre application explose !
Code : Sélectionner tout - Visualiser dans une fenêtre à part frame.add(canvas_);
Et j'avoue ne pas comprendre.#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6e2a9829, pid=3400, tid=9040
#
# JRE version: 7.0_21-b11
# Java VM: Java HotSpot(TM) Client VM (23.21-b01 mixed mode windows-x86 )
# Problematic frame:
# V [jvm.dll+0xa9829]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\jcef_1916_1804\src\out\win32\Debug\hs_err_pid3400.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#
[1211/153106:ERROR:stack_trace_win.cc(142)] SymInitialize failed: 87
[1211/153106:FATAL:context.cc(309)] Check failed: OnInitThread().
Error initializing symbols (87). Dumping unresolved backtrace:
2A514061
2A46383F
2A2A43A3
2A2A20AF
2FDDC9AD
2EE2DBD0
2EE2D98F
2EE21EC1
2EE21E03
77A699A0
77A7D702
Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?
Merci d'avance pour votre aide.
Partager