java - Tomcat 中的共享 JNI 库 (.so) - UnsatisfiedLinkError

标签 java tomcat web-applications java-native-interface shared-libraries

我有一个在 Tomcat7 中部署的两个 Web 应用程序之间共享的 JNI 库 (.so)。我在正在部署的第一个 Web 应用程序中仅使用 System.loadLibrary 加载一次库,然后在第二个中我检查它是否已经加载以不再加载(我尝试在两者中加载它并且我得到 UnsatisfiedLinkError - 库由另一个类加载器加载)。我可以在第一个应用程序中对 native 库进行任何调用,但在第二个应用程序中,我得到 UnsatisfiedLinkError 以及我尝试调用的方法名称。

我已经想不出自己能做什么了。有任何想法吗?我在 SO 上尝试了大部分解决方案。 谢谢。

编辑 是的,我尝试将库添加到 tomcat lib 文件夹中并从那里加载它。最初它位于 bin 文件夹中,但出现了同样的问题。

最佳答案

是的,当您尝试加载已经加载了我的另一个 Web 应用程序的库时,就会发生这种情况。 Tomcat,为每个 Web 应用程序使用单独的类加载器,它不允许您通过另一个类加载器将同一个 native 库多次加载到 JVM

移动任何共享 jar 文件(如果有的话)从您的 sharedlib.so 使用 JNI。将系统路径添加到 sharedlib ,

export LD_LIBRARY_PATH=/path/to/whereyourlinklibrary

像这样编写一个简单的类,使您能够在 tomcat 启动时加载您的共享库。只需编译此类并将其放入 tomcat lib 文件夹中

package msm;
public class DLLBootstrapper {

     static {
      System.loadLibrary("sharedlib");
     }

     public static void main(String args[]) {
      System.out.println("Loaded");
     }

    }

您现在可以从您的任何 Web 应用程序(可能在启动监听器中)加载此类

Class.forName("msm.DLLBootstrapper");

干得好!

关于java - Tomcat 中的共享 JNI 库 (.so) - UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40043849/

相关文章:

javascript - Json数据格式化最佳实践

Java 图形2D;切换我拥有的形状对象的绘制顺序?

javascript - 是否可以使用 HTML、CSS 和 Javascript 构建 LibreOffice 侧边栏插件

java - eclipse 重构插件

java - Intellij 内置应用服务器

hosting - 如何以经济实惠的方式发布 Web 应用程序

java - Web 应用程序上的线程 LDAP 修改

java - spring-boot 在单个 Web 应用程序路径上设置基本身份验证?

java - 如何将 32 位 Java Web 应用程序迁移到 64 位?

java - Docker + Tomcat + .properties -- 环境变量