无法调用JNI方法时库由通用类加载器

问题描述:

我试图要部署的Windows上使用JNI库到Tomcat 6,并已运行到不良UnsatisfiedLinkError问题(已装入另一个类加载器)时,应用程序是一个Web服务加载在Tomcat管理器中重新启动。无法调用JNI方法时库由通用类加载器

我看到解决这个最好的做法是从另一个类,在一个jar文件中指定,并放置加载JNI库到$(TOMCAT_HOME)/ lib目录下。当我这样做时,我无法调用任何JNI方法,但我可以看到JNI库已加载。

这个片段的工作:

package com.mywebservice; 

import javax.jws.WebService; 
import javax.annotation.PostConstruct; 

@WebService 
class MyWebServiceImpl implements MyWebService { 

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

    @PostConstruct 
    public native void Start(); 
} 

启动功能在JNI库作为Java_com_mywebservice_MyWebServiceImpl_Start定义和被调用。

下面的代码不会为我工作。首先,作为MyLoader.jar进入$(TOMCAT_HOME)/ lib的loader类。

package com.myloader; 

public class MyLoader { 

    static { 
     System.loadLibrary ("MyJNILibrary"); 
     System.out.println ("Library loaded"); 
    } 

    public static void main(String[] args) {} 
} 

其次,修改后的web服务,通​​过加载器加载库,仍下的webapps war文件:

package com.mywebservice; 

import javax.jws.WebService; 
import javax.annotation.PostConstruct; 

@WebService 
class MyWebServiceImpl implements MyWebService { 

    static { 

     try { 
      Class.forName ("com.myloader.MyLoader"); 
      System.out.println ("Class found"); 
     } 

     catch (ClassNotFoundException e) { 
      System.out.println ("Class not found"); 
     } 
    } 

    @PostConstruct 
    public native void Start(); 
} 

有了这个代码,我看到当试图以犯了一个错误调用Start方法:

Caused by: java.lang.UnsatisfiedLinkError: com.mywebservice.MyWebServiceImpl.Start()V 

使用诊断我可以看到MyLoader类被发现,而且JNI库被加载(并锁定)。所以我很困惑为什么这不起作用。

Windows 2003 Server上使用Tomcat 6.0.43,JDK 6u45,Eclipse的开普勒。

这是它是如何工作的,我只是失去了一些东西?如果是这样,这个项目有什么意义:https://code.google.com/p/static-dll-bootstrapper/,它只是加载属性文件中指定的DLL的?

+0

还试图与Tomcat 8,Windows 8.1,JDK 8u45。同样的问题。该库加载但没有找到JNI函数。 – rushman

类包含本地方法应该加载自己的图书馆。其他任何事情都会引发这个问题。没有理由分开这个功能。

+0

是的,但如果我这样做,那么如果我只想重启我的Web服务,由于我的JNI库被多个类加载器加载,我必须重新启动整个Tomcat服务。因此,为什么我需要将库加载分离到一个单独的类中。 – rushman

+0

例如,请查看此主题:http://*.com/a/13242602/1010617 – rushman