[mapserver] Java VM Crashes using the Mapscript API

Sean Gillies sgillies at FRII.COM
Thu Jul 28 16:15:56 EDT 2005


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
>



More information about the mapserver-users mailing list