Hello,

I have a question using native JNI shared objects within a servlet running 
under Tomcat 5.5.  Our servlet code depends on some shared .dll files (for 
windows, and .so files for Linux).  so we have classes that have code such as:

public class Abc {
    public native static boolean nativeF0(int a,String b);
    /* ... other native method declarations ... */
    static {
        System.loadLibrary("objectfile");
    }
}

Obviously the idea is that the shared object objectfile.dll is loaded whenever 
the native methods are accessed.  However, Tomcat seems to create a new Java 
class-loader whenever a web-app is reloaded via using the Tomcat "manager" 
web-app.  Because of the new class-loader, the "static { 
System.loadLibrary(...); }" method is re-executed and the 2nd call to 
loadLIbrary yields an JRE error "java.lang.UnsatisfiedLinkError: Native Library 
objectfile.dll already loaded in another classloader" followed by a JRE crash.

The workaround is to completely stop and restart the entire Tomcat server every 
time I modify my web-app.  But this is cumbersome and makes our web-app harder 
to deploy and patch.  Catching and ignoring the UnsatisfiedLinkError solves 
nothing because the classes loaded in the 2nd class-loader can't find the 
native methods.

Can someone please give me some advice as to how to do one of the following:
    a.  Unload my original objectfile.dll when my web-app is stopped so when it 
is restarted it loads normally in the new class-loader
    b.  Connect the native libraries from the first class-loader to the second 
class-loader after the web-app is reloaded
    c.  Other possibilities to work around this?

Thank you,
Eric Johanson

Reply via email to