Hi Eric,
I have a JNI application also and I followed the advise from the Tomcat
documentation, where they suggest that the class that loads the dll's or
so's libraries are placed either in the shared/classes directory or the
common/classes directory. I do it in the shared/classes directory. It is not
exactly what I would like, but it works.
Hope that helps,
--Luis R.
On 10/11/06, Eric Johanson <[EMAIL PROTECTED]> wrote:
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