I have a webapp running under Tomcat 3.2.1 that needs to make JNI calls in order to access data and methods in legacy C++ code. A servlet is loaded on startup of the webapp that, as part of its init
method, causes a data set specific to that webapp instance to be loaded into the C++ data structures.
This Java code for this servlet contains the following:
static { try { System.loadLibrary("JCoreImpl"); System.out.println("JCoreImpl loaded"); m_bLibraryLoaded = true; } catch (UnsatisfiedLinkError e) { m_bLibraryLoaded = false; System.out.println("JCoreImpl NOT loaded " + e); } }
Things work fine if there is only one webapp (let's call it "webapps/aaa").
If I have a second webapp ("webapps/bbb") that is identical to webapps/aaa except for the data set used in the C++ data structures, then webapps/aaa starts up just fine, but when webapps/bbb is started I get an error stating that:
JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader
I need to have a separate instance of the native library for each of my webapps as each instance needs to contain data that is unique to that particular webapp. I have searched through the mail archives and read emails by Craig McLanahan explaining the classloader hierarchy. But I have not been able to find anything specific to loading a unique instance of a native library for each webapp.
You can't load the same native library twice.
Put the class in a jar file under <tomcat>/lib/
, it will be shared over all wars.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With