[mapserver] Java VM Crashes using the Mapscript API

Fernando Simon fsimon at UNIVALI.BR
Thu Jul 28 15:59:20 EDT 2005


Hi Sean,
    Thanks for your reply, I will check my code to improve it with
your hints. The blank backgound appear when I define a labelobject by
hand using JavaMapscript and set the it (setLabel) to my class.
    If I save the "mapscript mapfile" the label appear with a black
definition for background. I solve this problem using the way that I
wrote in the last e-mail. Any hints why occur this black backgound?
     Thanks.

Fernando Simon

Citando Sean Gillies <sgillies at FRII.COM>:

> Fernando,
> 
> This is improper usage and will result in memory leaks. An instance
> of 
> labelObj already holds references to many allocated colorObjs, and
> if 
> you bind new instances to the labelObj the originals will not be
> freed. 
> An example of proper usage is
> 
>      label.color.setRGB(0, 0, 0);
> 
> All colors should be undefined (-1,-1,-1) by default, so I am at a
> loss 
> how you get a black label background.
> 
> Sean
> 
> On Jul 28, 2005, at 1:27 PM, Fernando Simon wrote:
> 
> > Hi all,
> >     I found the same problem with black blackground here some
> weeks
> > ago, I solved the problem when I defined a blank color objects
> for
> > backgoundcolor and backgoundshadowcolor. Like:
> >             lObjCor = new colorObj(-1, -1, -1, 0);
> >             lObjLabel.setBackgroundcolor(lObjCor);
> >             lObjLabel.setBackgroundshadowcolor(lObjCor);
> >      So, using this way I can define all my layer using
> JavaMapscript.
> > To check the "mapscript mapfile" you can save it to see all the
> > definitions.
> >      Thanks.
> >
> >
> > Fernando Simon
> >
> >
> > Citando Rick Innis <rick at INNIS.CA>:
> >
> >> Im revisiting this somewhat old thread to contribute a few
> insights
> >>
> >> I've found while dealing with the same issue, in the hope it
> saves
> >>
> >> someone else time and effort in the future. The thread
> "Mapscript
> >>
> >> API: for object manipulation, not object creation?" , from
> earlier
> >>
> >> this year, also has some info on this topic.
> >>
> >>>>
> >>>> Christian reported a crash in layerObj.delete() which I
> >>>> also detected.
> >>>> I think I understood the following:
> >>>>
> >>>> Let's say, we have an initialized  mapObj mO;
> >>>>
> >>>> layerObj lO = new layerObj(mO);
> >>>> // Say lO is the 5th layer now.
> >>>> // Now lO.swigCMemOwn == true and
> >>>> //     lO.swigCPtr points onto the mO.swigCPtr->layers[4]
> >>>>
> >>>> ...
> >>>> // now the mapObj is deleted but the Java-layerObj continues
> to
> >> live.
> >>>> // the C-layer-Object mO.swigCPtr->layers[4] will deleted and
> >>>> freed also!
> >>>> mO.delete()
> >>>> // From now on O.swigCPtr points into invalid piece of
> >> C-memory.
> >>>> ...
> >>
> >> I also encountered this a few months back but didn't have time
> to
> >>
> >> write it up so coherently. One workaround I was given by Sean
> was
> >> to
> >> use insertLayer() to add the layer, which makes a copy,
> allowing
> >> the
> >> allocated Java object to be disposed of cleanly. This also
> requires
> >>
> >> making and inserting styleObj and classObj instances:
> >>
> >>                  // initially, layer not associated with any
> map
> >>                  layerObj myLayer = new layerObj(null);
> >>                  // initialise layer
> >>                  classObj myClass = new classObj(null);
> >>                  styleObj myStyle  = new styleObj(null);
> >>                  // initialize style, then insert into class
> >>                  myClass.insertStyle(styleObj, -1);
> >>                  // insert class into layer
> >>                  myLayer.insertClass(myClass, -1);
> >>                  // insert layer into map - makes copy!
> >>                  int ret = map.insertLayer(annos, -1);
> >>                  // get reference to inserted copy
> >>                  myLayer = map.getLayer(i);
> >>
> >>
> >> However, when  I started labelling my dynamic layers I found
> that
> >> my
> >> labels ended up with a black background.  The workaround I
> found
> >> was
> >> to define an empty layer in my map, including empty style info,
> and
> >>
> >> use cloneLayer() to make copies as needed.
> >>
> >> The layer definition looks like this:
> >>
> >>          # Blank generic annotation layer
> >>          LAYER
> >>                  NAME user_layer
> >>                  STATUS OFF
> >>                  TYPE POINT
> >>                  CLASS
> >>                      STYLE
> >>                          COLOR 255 255 255
> >>                      END
> >>                      LABEL
> >>                          COLOR 255 255 255
> >>                      END
> >>                  END
> >>          END
> >>
> >> To use it, I grab the layer from the map, clone it, initialize
> it,
> >>
> >> and insert the clone into the map:
> >>
> >>                  layerObj myLayer = map.getLayerByName
> >> ("blank_layer").cloneLayer();
> >>                  // initialise...
> >>                  int ret = map.insertLayer(annos, -1);
> >>
> >> The layer's type can be changed on the fly, so one definition
> >> suffices for all layers.
> >>
> >>      --Rick.
> >>
> >
> >
> >
> >
> > -------------------------------------------------
> >   Univali - Webmail - http://webmail.univali.br
> >
> >
> --
> Sean Gillies
> sgillies at frii dot com
> http://zcologia.com
> 




-------------------------------------------------
  Univali - Webmail - http://webmail.univali.br



More information about the mapserver-users mailing list