[mapserver] Java VM Crashes using the Mapscript API
Sean Gillies
sgillies at FRII.COM
Thu Jul 28 13:15:56 PDT 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