.dll已经加载到另一个类加载器中了?

kri*_*mar 21 java-native-interface web-applications javabeans

我有一个在Tomcat 3.2.1下运行的webapp,需要进行JNI调用才能访问旧C++代码中的数据和方法.在启动webapp时加载servlet,作为其init方法的一部分,将使特定于该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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果只有一个webapp(我们称之为"webapps/aaa"),事情就可以了.

如果我有第二个webapp("webapps/bbb")与webapps/aaa相同,除了C++数据结构中使用的数据集,那么webapps/aaa启动就好了,但是当webapps/bbb启动时,我得到了错误陈述:

JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library
E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader
Run Code Online (Sandbox Code Playgroud)

我需要为每个webapps都有一个单独的本机库实例,因为每个实例都需要包含该特定webapp所特有的数据.我搜索了邮件档案并阅读Craig McLanahan的电子邮件,解释了类加载器的层次结构.但是我无法找到任何特定于为每个webapp加载本机库的唯一实例的内容.

J-1*_*DiZ 15

您无法两次加载相同的本机库.

将该类放在一个jar文件下<tomcat>/lib/,它将在所有战争中共享.


小智 9

在Tomcat HowTo wiki上使用Tomcat 下的JNI时,请参阅我遇到类加载器问题的部分(http://wiki.apache.org/tomcat/HowTo)