Tomcat UnsatisfiedLinkError中的共享本机库

时间:2013-06-16 20:43:07

标签: tomcat java-native-interface classloader

我需要在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似乎无法在本机库中找到合适的函数。我错过了什么?

1 个答案:

答案 0 :(得分:2)

您错过了问题未加载库,这是您的大多数问题所致:它是方法签名。它与加载的库中实际存在的内容不一致。自生成.h文件以来,您是否更改了Java本机方法签名?如果是这样,重新生成它。你的.h文件是否与你的.c或.cpp文件一致?你是否在.c / .cpp文件中包含.h文件?所有这些条件都是必需的。