tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Cox, Charlie" <c...@cincom.com>
Subject RE: Native library cannot be loaded twice
Date Tue, 25 Jun 2002 14:00:58 GMT
did you restart tomcat since your class is in common/classes? 

you may want to wrap the loadlibrary() in a singleton. I'm not sure that you
can use Class.forName on a class with no methods or fields. You may also
want to see if the native functions are available even if the Class.forName
is throwing an error. The static block should be run automatically by the
classloader, but I'm not sure if it does this when the class is loaded, or
when it is first called.

you do want your class in /common/classes so that it can only be loaded
once.

I have my library on the system path(win2k) and it works fine. If you had it
working before(if only the first time), then the library was in the right
place.

Charlie

> -----Original Message-----
> From: Andreas Hirner [mailto:andreas@projektinter.net]
> Sent: Tuesday, June 25, 2002 7:41 AM
> To: Tomcat Users List
> Cc: sag@stark-verlag.de
> Subject: Re: Native library cannot be loaded twice
> 
> 
> Hi,
> 
> > A bit off-topic (this goes into native programming), but there is
> something
> > whirling through my head:
> >
> > Static classes/members are instantiated once. But what happens if
> multiple
> > classloaders are used? Such as you have this one class static but
> use it in
> > several web applications?
> >
> > Seems like it MUST reside in common/lib instead of
> webapp/*/web-inf/lib?
> >
> > Hiran
> 
> This is where my problem is. I was developing a servlet, which loaded
> a native library and subsequently called some native functions.
> Everything was working fine, but whenever I made changes to the
> servlet and reloaded the application with the manager/relaod call the
> native library was instanciated a second time and crashed. I had to
> stop and restart tomcat in order to see any changes made to the
> servlet.
> 
> So I wrote and compiled a class called InitMapserver, which looks like
> that:
> 
>  public class InitMapserver
>  {
> 
>   static {
>    try {
>       System.loadLibrary("mapscript");
>       System.err.println("libmapscript.so loaded");
>    } catch (UnsatisfiedLinkError e) {
>       System.err.println("libmapscript.so not loaded: " + e);
>    }
>   }
> 
>  }
> 
> and put it into the common/classes directory. Then I try to load this
> class in a servlet
> doing:
> 
>  public void init(ServletConfig config) throws ServletException
>  {
>   try
>   {
>      Class.forName("InitMapserver");
>   } catch (ClassNotFoundException ex) {
>      file://throw new ServletException(ex.getMessage() + "Class
> InitMapserver not     found");
>      System.err.println(ex.getMessage() + "Class InitMapserver not
> found");
>   }
>  }
> 
> Unfortunately this does not work. Any suggestions???
> 
> Thanks
> Andreas
> 
> > > > Concerning the JDK documentation a native lib should be loaded
> in a
> > > static
> > > > scope. Static resources are processed differently, because the
> > > runtime
> > > > systems has to initialize all static resources at the beginning.
> > > After that
> > > > the runtime system tries to initialize objects and these objects
> > > can - of
> > > > course - use all static resources.
> > > >
> > > > A look into your code (InitMapserver) shows, that the runtime
> system
> > > cannot
> > > > initialize the static resource in the common way, because it
> first
> > > must
> > > > generate an object and this object contains code for doing some
> > > static
> > > > stuff. Maybe this is the reason for the strange behavior.
> > >
> > > I am sorry, but I am not a skilled Java Programmer and I don't
> quite
> > > understand what you mean. Can you try to explain it more
> explicitly or
> > > give some examples. I hope I am not asking to much....
> 
> 
> 
> 
> --
> To unsubscribe, e-mail:   
> <mailto:tomcat-user-unsubscribe@jakarta.apache.org>
> For additional commands, e-mail: 
> <mailto:tomcat-user-help@jakarta.apache.org>
> 

--
To unsubscribe, e-mail:   <mailto:tomcat-user-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:tomcat-user-help@jakarta.apache.org>


Mime
View raw message