[mapserver] Java VM Crashes using the Mapscript API

Fernando Simon fsimon at UNIVALI.BR
Fri Jul 29 11:20:07 EDT 2005


Sean,
    Thanks for your reply. 
    Now, after your hints, I have some doubts, using SWIG (Java
support) if I do this code: lObjLabel = lObjClass.getLabel(); And
after I change some attributes for the lObjLabel,  these changes will
affect the lObjClass.label? Is it the same objects, lObjLabel
reference the same that lObjClass.getLabel(), or is a new copy? After
I change the attributes I need to do a setLabel?
    The other doubt is about the delete() function for the objects. If
I call this function the objects (in JavaSwig) will be release or
clean the objects? In the lObjLabel, this function will be clean the
lObjClass.label?
    The last doubt :) what is the objects that exist by default when I
create a new class object or layer object?
    Thanks

Fernando Simon

Citando Sean Gillies <sgillies at frii.com>:

> Now I understand. You should never bind a new labelObj to a
> classObj. 
> All the MapServer classes exist primarily to support the CGI
> mapserv 
> program, and therefore are complete. An new instance of classObj,
> for 
> example, already contains a labelObj attribute named "label". To
> set a 
> class's label color, you should do this
> 
>      class.label.color.setRGB(red, green, blue)
> 
> Sean
> 
> On Jul 28, 2005, at 1:59 PM, Fernando Simon wrote:
> 
> > 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
> >
> 
> 




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



More information about the mapserver-users mailing list