我需要在Tomcat中加载本机库,供Web应用程序使用。我已经创建了一个包装类,该包装类调用System.load(“ path / to / library”),如下所述:
http://wiki.apache.org/tomcat/HowTo#I.27m_encountering_classloader_problems_when_using_JNI_under_Tomcat

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

public class FooWrapper {
    public native void doFoo();
}


我可以从一个独立的应用程序中调用doFoo()(这意味着可以正确导出用C编写的本机方法Java_packagename_FooWrapper_doFoo(...))。
但是,当我从Web应用程序调用doFoo方法时,我得到:

java.lang.UnsatisfiedLinkError: packagename.FooWrapper.doFoo()V


我可以使用此处描述的技巧获取由ClassLoader加载的本机库的列表:How do I get a list of JNI libraries which are loaded?

   java.lang.reflect.Field loadedLibraries = ClassLoader.class.getDeclaredField("loadedLibraryNames");
   loadedLibraries.setAccessible(true);
   final Vector<String> libraries = (Vector<String>) loadedLibraries.get(ClassLoader.getSystemClassLoader());


并且我的本机库在库矢量中列出,因此调用System.load(...)的静态块将毫无例外地执行。但是,当我从Web应用程序调用doFoo()时,似乎Java无法在本机库中找到合适的函数。我想念什么?

最佳答案

您会丢失问题是没有加载库,而这正是您大多数问题所致力于的:这是方法签名。它与加载的库中的实际内容不同。自生成.h文件以来,您是否更改过Java本机方法签名?如果是这样,请重新生成它。 .h文件与.c或.cpp文件是否一致?您是否在.c / .cpp文件中包括.h文件?所有这些条件都是必需的。

关于tomcat - Tomcat中的共享 native 库UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17137510/

10-10 09:41