[mapserver] Java VM Crashes using the Mapscript API

Fernando Simon fsimon at UNIVALI.BR
Thu Jul 28 15:27:26 EDT 2005


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



More information about the mapserver-users mailing list