Return-Path: Delivered-To: apmail-jakarta-tomcat-user-archive@apache.org Received: (qmail 13514 invoked from network); 27 Jun 2002 13:26:05 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by 209.66.108.5 with SMTP; 27 Jun 2002 13:26:05 -0000 Received: (qmail 7014 invoked by uid 97); 27 Jun 2002 13:25:36 -0000 Delivered-To: qmlist-jakarta-archive-tomcat-user@jakarta.apache.org Received: (qmail 6998 invoked by uid 97); 27 Jun 2002 13:25:35 -0000 Mailing-List: contact tomcat-user-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tomcat Users List" Reply-To: "Tomcat Users List" Delivered-To: mailing list tomcat-user@jakarta.apache.org Received: (qmail 6976 invoked by uid 98); 27 Jun 2002 13:25:35 -0000 X-Antivirus: nagoya (v4198 created Apr 24 2002) Message-ID: <002101c21dde$69013ff0$0d01a8c0@PIFileServer> From: "Andreas Hirner" To: "Tomcat Users List" Cc: References: <399E1F52E73BD41194A800D0B74A08AB01E4DA02@skipper.cincom.com> Subject: Re: Native library cannot be loaded twice Date: Thu, 27 Jun 2002 15:27:33 +0200 X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4522.1200 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4522.1200 X-Spam-Rating: 209.66.108.5 1.6.2 0/1000/N X-Spam-Rating: 209.66.108.5 1.6.2 0/1000/N Hello, thanks for the information. Since I am not an experienced Java programmer the singleton concept was new to me. But there are still a couple of questions left. How do I call the native method in the servlet. Can I use the Class.forName() method or do I have create an instance of the singleton. Furthermore you say that: > keep in mind that this singleton will not > be able to reference any classes you have in any webapp, only the classes in > \common\classes(or lib). Since I am only using the singleton to load a native library this should not pose any problems. Or are there any cases where I have to keep this in mind? Thank you in advance Andreas ################################################# > each webapp gets its own classloader. Therefore each > static(block,class,method,etc) is loaded in EACH classloader and is 'static' > only within that classloader. So when your library is loaded from a servlet > located in web-inf/lib(or classes), it is loaded for each webapp that > contains that .class file. But since native libraries can only be loaded > once, when it tries to load a second time you get the error. > > I believe the class loader is removed and replaced with a new one upon > reload. Since the old classloader loaded the native library, when the new > one tries to reload your updated class, it fails because the library is > already loaded.(A native library can only be loaded once in a jvm) > > When you put the class that loads the library into \common\lib, then it is > loaded at tomcat startup, and the class is not unloaded until shutdown. > Classes in common\lib are available as one instance to all tomcat webapps in > all virtual hosts. > > So if you wrap your loadlibrary in a singleton class that is located in > \common\classes, you can instantiate that class as many times as you need > to, but it only gets loaded once. keep in mind that this singleton will not > be able to reference any classes you have in any webapp, only the classes in > \common\classes(or lib). > > this is the way that I load my library: > public class MySingleton > { > static private MySingleton m_mySingleton = null; > > /** private constructor to enforce singleton use. */ > private MySingleton() > { > } > > static private void createInstance() > { > if (m_mySingleton == null) > { > m_mySingleton = new MySingleton(); > System.loadLibrary("mylibrary"); > } > } > } > > Charlie > > > > > Andreas > > > > > > -----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: > > > > > > > > For additional commands, e-mail: > > > > > > > > > > > > > > -- > > > To unsubscribe, e-mail: > > > > > For additional commands, e-mail: > > > > > > > > > > > > > > > > > > > -- > > To unsubscribe, e-mail: > > For additional commands, e-mail: > > > -- > To unsubscribe, e-mail: > For additional commands, e-mail: > > > -- To unsubscribe, e-mail: For additional commands, e-mail: