1

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

4

1 回答 1

2

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

于 2013-06-19T00:24:50.743 回答