Fwd: jvm crash on ubuntu 8.10 with javaxpcom code
Gonzalo Tirapegui Medina <[email protected]> Tue, 14 Apr 2009 15:09:08 -0400
| Newsgroups | gmane.comp.mozilla.devel.java |
|---|---|
| Message-ID | <[email protected]> |
Sorry , i forgot to send it to the list instead of your mail ---------- Forwarded message ---------- From: Gonzalo Tirapegui Medina <[email protected]> Date: 2009/4/14 Subject: Re: jvm crash on ubuntu 8.10 with javaxpcom code Greg , i'm trying to change the selection's process on a nsIEditingSession by modifying the nsIHTMLObjectResizer interface (in order to standarize the selection's box on all components ) . After i get nsIEditingSession i query the interface and add some nsIHTMLObjectResizeListener<http://www.oxymoronical.com/experiments/apidocs/platform/1.9.2a1pre/interface/nsIHTMLObjectResizeListener>object. The main idea of this is to intercept the resizing process by nesting temporarily the resized object into a div object , resize this " temporal div container " and commit the changes into the child node after the mouse is released (end of the resizing process) ... my problem is that i don't know wich interface can set the resized DOM object or how can i acces this attribute . here is some code myObjectResizer = XPCOMUtils.qi(myHtmlEditor, nsIHTMLObjectResizer.class); myObjectResizer.addObjectResizeEventListener(new nsIHTMLObjectResizeListener() { public void onStartResizing(nsIDOMElement arg0) { /* here i want to create the div object , nest arg0 into it and change the resizedObject into the session by the div */ } public void onEndResizing(nsIDOMElement resizedElement, int oldWidth, int oldHeight, int newWidth, int newHeight) { /* here i want to commit the changes to the nested element */ } public nsISupports queryInterface(String uuid) { return Mozilla.queryInterface(this, uuid); } }); 2009/3/20 Greg Bowyer <[email protected]> > <Posting this back to the dev list because other, wiser people will know > more> > > Could you point me to what ediutor interfaces you are looking at, largly > what is exposed by java xpcom is actually the XPCOM system proper; that is > its just a language bridge rather than anything specific to java bindings. > > What do you mean by canvas ? the <canvas> tag ? > > Is this the chrome (XUL) dom or a different content (say html) you are > manipulating > > I would probably need to see more of your code to work out what you are > trying to do one the DOM direct from the underlying code, but my gut feel is > that rather than do this from java, it would probably be a *lot* easier to > do it in javascript > > On 20/03/09 13:55, Gonzalo Tirapegui Medina wrote: > > Thanks Greg , i initialize the gtk context and the jvm's crash just > disappear. Now i have a question a little bit different . > I'm planning to do some GUI Editor based on the editor interfaces of java > xpcom . The problem is the widgets that we will drop into the Mozilla Canvas > are composed by many nested DOM Objects , and The selection Model of the > Editor Interfaces is adapted to select just the DOM object that we are > clicking. Can you give me some orientation about what interfaces i need to > rewrite to select the "father" component of the clicked Dom node , instead > of just the Dom node itself? > > Regards , Gonzalo Tirapegui Medina > > 2009/3/20 Greg Bowyer <[email protected]> > > On 09/03/09 03:15, Gonzalo Tirapegui wrote: > > Hi all > > i'm trying to run some examples of the javaxpcom interfaces , in order > to do that , i've download the xulrunner-sdk tar and execute the > following code : > > > public class Main { > > public static class LocationProvider implements IAppFileLocProvider { > > File grePath; > > public LocationProvider(File grePath) { > this.grePath = grePath; > } > > public File getFile(String aProp, boolean[] aPersistent) { > System.out.println(aProp); > System.out.println(aPersistent); > > File file = null; > if (aProp.equals("GreD") || aProp.equals("GreComsD")) { > file = grePath; > if (aProp.equals("GreComsD")) { > file = new File(file, "components"); > } > } else if (aProp.equals("MozBinD") || aProp.equals("CurProcD") > || aProp.equals("ComsD") || aProp.equals("ProfD")) { > file = grePath; > if (aProp.equals("ComsD")) { > file = new File(file, "components"); > } > } > return file; > } > > public File[] getFiles(String aProp) { > System.out.println(aProp); > > File[] files = null; > if (aProp.equals("APluginsDL")) { > files = new File[1]; > files[0] = new File(grePath, "plugins"); > } > return files; > } > } > > public static void main(String[] args) { > > System.setProperty("GRE_HOME", "/home/teckla/core/xulrunner-sdk/bin"); > System.setProperty("java.library.path", > "/home/teckla/core/xulrunner-sdk/bin"); > > Mozilla mozilla = Mozilla.getInstance(); > GREVersionRange[] range = new GREVersionRange[1]; > range[0] = new GREVersionRange("1.8.0", true, "1.9", false); > // work with trunk nightly version 1.9a1 > try { > File grePath = Mozilla.getGREPathWithProperties(range, null); > System.out.println(grePath.toString()); > mozilla.initialize(grePath); > LocationProvider locProvider = new LocationProvider(grePath); > mozilla.initEmbedding(grePath, grePath, locProvider); > > // Note, on linux, gtk has to be already initialized for this code to work > Mozilla moz = Mozilla.getInstance(); > // Now we need to start an XUL application, so we get an instance of the > XPCOM service manager > nsIServiceManager serviceManager = moz.getServiceManager(); > // Now we need to get the @mozilla.org/toolkit/app-startup;1 service: > nsIAppStartup appStartup = > (nsIAppStartup)serviceManager.getServiceByContractID("@ > mozilla.org/toolkit/app-startup;1", > nsIAppStartup.NS_IAPPSTARTUP_IID); > // Get the nsIWindowWatcher interface to the above > nsIWindowCreator windowCreator = > > (nsIWindowCreator)appStartup.queryInterface(nsIWindowCreator.NS_IWINDOWCREATOR_IID); > > // Get the window watcher service > nsIWindowWatcher windowWatcher = > (nsIWindowWatcher)serviceManager.getServiceByContractID("@ > mozilla.org/embedcomp/window-watcher;1", > nsIWindowWatcher.NS_IWINDOWWATCHER_IID); > // Set the window creator (from step 6) > windowWatcher.setWindowCreator(windowCreator); > // Create the root XUL window: > nsIDOMWindow win = windowWatcher.openWindow(null, > "chrome://your-app/content/window.xul", "mywindow", > "chrome,resizable,centerscreen", null); > // Set this as the active window > windowWatcher.setActiveWindow(win); > // Hand over the application to xpcom/xul, this will block: > appStartup.run(); > } catch (FileNotFoundException e) { > e.printStackTrace(); > } catch (XPCOMException e) { > e.printStackTrace(); > } > > } > } > > > > .... but by some reason , the jvm crash on the line : > > nsIDOMWindow win = windowWatcher.openWindow(null, > "chrome://your-app/content/window.xul", "mywindow", > "chrome,resizable,centerscreen", null); > > giving the following trace : > > > > > > (process:22320): GLib-GObject-CRITICAL **: > /build/buildd/glib2.0-2.18.2/gobject/gtype.c:2458: initialization > assertion failed, use IA__g_type_init() prior to this function > > (process:22320): GLib-CRITICAL **: g_once_init_leave: assertion > `initialization_value != 0' failed > > (process:22320): Gdk-CRITICAL **: gdk_screen_get_rgb_visual: assertion > `GDK_IS_SCREEN (screen)' failed > # > # An unexpected error has been detected by Java Runtime Environment: > # > # SIGSEGV (0xb) at pc=0x90209a6c, pid=22320, tid=3084917648 > # > # Java VM: Java HotSpot(TM) Server VM (10.0-b23 mixed mode linux-x86) > # Problematic frame: > # C [libxul.so+0x84aa6c] > # > # An error report file with more information is saved as: > # /home/teckla/Escritorio/lobobrowser > tests/testxulrunner/hs_err_pid22320.log > # > # If you would like to submit a bug report, please visit: > # http://java.sun.com/webapps/bugreport/crash.jsp > # The crash happened outside the Java Virtual Machine in native code. > # See problematic frame for where to report the bug. > # > Java Result: 134 > > > > Can anyone help me with this issue? > > > Regards , Gonzalo Tirapegui Medina > > > I am pretty sure your problem is that you have not initialised GTK before > you handed control over to the mozilla event loop. On *nix the embedding > toolkit does not take care of this for you (it does AFAIK take care of it on > windows and OSX). > > see > https://bugzilla.mozilla.org/show_bug.cgi?id=342691 and > https://bugzilla.mozilla.org/show_bug.cgi?id=343039 > for the full horror > > You basically need a small GTK init stub like the one below in C to get GTK > fired up correctly, link this up with JNI and you should be good to go. > > ----- > - SNIP SNIP C code > ----- > > #include <gtk/gtk.h> > #include "com_bonsaichicken_siterunner_xulrunner_GtkStub.h" > > /** > * Very very simple call that will shunt a GTK init on the C side > * of the JNI bridge > * this is a total hack to work around a know issue in XULRunner > * whereby it will not initialise on a linux box without GTK being > * pre-inited first > * > * note! this is *not* the official solution, that is coming when > * https://bugzilla.mozilla.org/show_bug.cgi?id=342691 and > * https://bugzilla.mozilla.org/show_bug.cgi?id=343039 > * are resolved properly (then this fugly hack will melt away) > * > * @author Greg Bowyer > */ > JNIEXPORT void JNICALL > Java_com_bonsaichicken_siterunner_xulrunner_GtkStub_gtk_1init > (JNIEnv *jniEnv, jclass clazz) { > > // Chances are that the following are not required, > // but in the case they maybe .... > // g_thread_init(NULL); > // gdk_threads_init(); > // g_set_prgname("XULRunner-X11-Linux-JavaXPCom") > // Don't sweat passing in argc, argv its not required or > // xulrunner the gdk / gtk code will function fine without this > gtk_init(0, NULL); > } > > --- > - End of C code > --- > > Give us a shout if you need more help with this > > >