Tomcat中共享的JNI库(.so)-不满意的链接错误

 2023-01-21    278  

问题描述

我在Tomcat7中部署的两个Web应用程序之间共享了一个JNI库(.SO).我使用系统加载库.在要部署的第一个Web应用程序中,只有一次,然后在第二个Web应用程序中,然后在第二个网络应用程序中检查它是否已经加载到不再加载(我尝试将其加载到两者中,而我却不舒服. – 库由另一个classloader加载).我可以在第一个应用程序中对本机库进行任何调用,但是在第二个应用程序中,我对我要调用的方法名称感到不满意.

我对我能做什么的想法已经用尽.有任何想法吗?我尝试了大多数解决方案.
谢谢.

Tomcat中共享的JNI库(.so)-不满意的链接错误

编辑
是的,我尝试在Tomcat Lib文件夹中添加库,然后从那里加载它.最初是在bin文件夹中,并且发生了相同的问题.

推荐答案

是的,当您尝试加载已经加载我的另一个Web应用程序的库时,这将发生. tomcat,为每个Web应用程序使用单独的类加载程序,并且不允许您通过另一个类加载程序

将相同的本机库多次加载到JVM

如果任何消耗您的jni sharedlib.so的共享JAR文件,请移动任何共享JAR文件.将系统路径添加到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");

很好!

其他推荐答案

您是否尝试将共享JNI库只是在服务器的LIB目录中.

其他推荐答案

您需要从服务器类中加载任何本机代码,而不是WebApp ClassLoader.我建议编写一个将共享对象的二进制图像加载到VM中的Listener.这只会发生一次. Please see the AprLifecycleListener如何正确地做到这一点.它包括一个JNI组合,可能完全代表您的情况.

共享对象必须驻留在${catalina.home}/lib和LD_LIBRARY_PATH帽子中才能指向它.

以上所述是小编给大家介绍的Tomcat中共享的JNI库(.so)-不满意的链接错误,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26224.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。