我需要在 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 加载的本机库的列表:如何获取已加载的 JNI 库的列表?
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 似乎无法在本机库中找到合适的函数。我错过了什么?