我有一个在 Tomcat 3.2.1 下运行的 webapp,它需要进行 JNI 调用才能访问遗留 C++ 代码中的数据和方法。servlet 在 webapp 启动时加载,作为其init
方法的一部分,该 servlet 将特定于该 webapp 实例的数据集加载到 C++ 数据结构中。
此 servlet 的 Java 代码包含以下内容:
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);
}
}
如果只有一个 webapp(我们称之为“webapps/aaa”),一切都会很好。
如果我有第二个 webapp(“webapps/bbb”),除了 C++ 数据结构中使用的数据集之外,它与 webapps/aaa 相同,那么 webapps/aaa 启动得很好,但是当 webapps/bbb 启动时我得到一个错误指出:
JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library
E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader
我需要为我的每个 web 应用程序拥有一个单独的本机库实例,因为每个实例都需要包含该特定 web 应用程序独有的数据。我搜索了邮件档案并阅读了 Craig McLanahan 解释类加载器层次结构的电子邮件。但是我找不到任何特定于为每个 webapp 加载本机库的唯一实例的东西。