Tomcat中的共享本机库未满足链接错误

Tomcat中的共享本机库未满足链接错误,tomcat,java-native-interface,classloader,Tomcat,Java Native Interface,Classloader,我需要在Tomcat中加载一个本机库,它将被web应用程序使用。我创建了一个调用System.load(“path/to/library”)的包装类,如中所述: 我的类定义类似于链接中的定义: public class FooWrapper { public native void doFoo(); } 我能够从独立应用程序调用doFoo()(这意味着用C编写的本机方法Java_packagename_FooWrapper_doFoo(…)被正确导出)。 但是,当我从web应用程序调

我需要在Tomcat中加载一个本机库,它将被web应用程序使用。我创建了一个调用System.load(“path/to/library”)的包装类,如中所述:

我的类定义类似于链接中的定义:

public class FooWrapper {
    public native void doFoo();
}
我能够从独立应用程序调用doFoo()(这意味着用C编写的本机方法Java_packagename_FooWrapper_doFoo(…)被正确导出)。 但是,当我从web应用程序调用doFoo方法时,我得到:

java.lang.UnsatisfiedLinkError: packagename.FooWrapper.doFoo()V
我可以使用下面描述的技巧获得类加载器加载的本机库的列表:

java.lang.reflect.Field loadedLibraries=ClassLoader.class.getDeclaredField(“loadedLibraryNames”);
loadedLibraries.setAccessible(true);
最终向量库=(向量)loadedLibraries.get(ClassLoader.getSystemClassLoader());

我的本机库列在库向量中,因此调用System.load(…)的静态块将毫无例外地执行。但是,当我从web应用程序调用doFoo()时,Java似乎无法在本机库中找到合适的函数。我错过了什么

您没有注意到问题在于没有加载库,而这正是您的大部分问题所关注的:它是方法签名。它与库中实际加载的内容不一致。自从生成.h文件以来,您是否更改了Java本机方法签名?如果是,请重新生成它。您的.h文件是否与.c或.cpp文件一致?是否将.h文件包括在.c/.cpp文件中?所有这些条件都是必需的。

Hello EJP,感谢您的回答,我没有把重点放在方法签名上,因为正如我所说的,它在独立应用程序中运行良好(即,在主方法中,加载库并调用本机方法运行时没有问题)。我用javah工具生成了头文件,并实现了一些方法。本机库已正确编译。UnsatifiedLinkError错误仅在tomcat上下文中显示。因此,您正在tomcat上下文中加载库的旧版本。
   java.lang.reflect.Field loadedLibraries = ClassLoader.class.getDeclaredField("loadedLibraryNames");
   loadedLibraries.setAccessible(true);
   final Vector<String> libraries = (Vector<String>) loadedLibraries.get(ClassLoader.getSystemClassLoader());