tomcat - Tomcat UnsatisfiedLinkError 中的共享 native 库

标签 tomcat java-native-interface classloader

我需要在 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/

相关文章:

java - 是否可以使用 apache tomcat 在客户端的应用程序中使用部署在 glassfish 中的 Web 服务?

java - 使用jboss5线程池启动线程

java - 服务器非托管线程中出现无法解释的 ClassNotFoundException

java - 如何使用tomcat将类设置为守护进程?

maven - jBCrypt 依赖项不起作用

java - tomcat异常上传shell

c++ - JNI - 返回在 native 函数中创建并由另一个 native 函数使用的 jobject

c++ - 在自建android中包含C++共享库。启动 ndk-build 时出错

java - 通过 JNI/DLL 或 EXE 执行 native 代码?

java - 设置ClassLoader的开销