我需要在 Tomcat 中加载一个 native 库,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 编写的 native 方法 Java_packagename_FooWrapper_doFoo(...) 已正确导出)。 但是,当我从 Web 应用程序调用 doFoo 方法时,我得到:
java.lang.UnsatisfiedLinkError: packagename.FooWrapper.doFoo()V
我能够使用此处描述的技巧获得由 ClassLoader 加载的 native 库的列表: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());
并且我的 native 库列在库向量中,因此调用 System.load(...) 的静态 block 无一异常(exception)地执行。但是,当我从网络应用程序调用 doFoo() 时,Java 似乎无法在 native 库中找到合适的函数。我错过了什么?
最佳答案
您没有注意到问题不在于加载库,这是您的大部分问题都致力于解决的问题:它是方法签名。它与加载的库中的实际内容不一致。自生成 .h 文件后,您是否更改了 Java native 方法签名?如果是这样,请重新生成它。您的 .h 文件是否与您的 .c 或 .cpp 文件一致?您是否将 .h 文件包含在 .c/.cpp 文件中?所有这些条件都是必需的。
关于tomcat - Tomcat UnsatisfiedLinkError 中的共享 native 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137510/