无法调用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的?
还试图与Tomcat 8,Windows 8.1,JDK 8u45。同样的问题。该库加载但没有找到JNI函数。 – rushman