Java 当公共类加载器加载库时,无法调用JNI方法
我正在尝试部署一个web服务,它使用一个JNI库在Windows上部署Tomcat 6,并且在Tomcat Manager中重新启动应用程序时,遇到了另一个类加载器中已加载的不受欢迎的UnsatifiedLinkError问题 我认为解决这个问题的最佳实践是从另一个类加载JNI库,该类在jar文件中指定,并放入$TOMCAT_HOME/lib中。当我这样做时,我无法调用任何JNI方法,但我可以看到JNI库已加载 此代码段适用于:Java 当公共类加载器加载库时,无法调用JNI方法,java,c++,tomcat,Java,C++,Tomcat,我正在尝试部署一个web服务,它使用一个JNI库在Windows上部署Tomcat 6,并且在Tomcat Manager中重新启动应用程序时,遇到了另一个类加载器中已加载的不受欢迎的UnsatifiedLinkError问题 我认为解决这个问题的最佳实践是从另一个类加载JNI库,该类在jar文件中指定,并放入$TOMCAT_HOME/lib中。当我这样做时,我无法调用任何JNI方法,但我可以看到JNI库已加载 此代码段适用于: package com.mywebservice; import
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,并被调用
下面的代码对我不起作用。首先,loader类作为MyLoader.jar进入$TOMCAT_HOME/lib
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库被加载并锁定。所以我很困惑为什么这不起作用
在Windows2003服务器上使用Tomcat6.0.43,JDK6U45,EclipseKepler
这就是它的工作原理,而我只是错过了一些东西?如果是这样,这个项目的意义是什么:,它只是加载属性文件中指定的DLL?包含本机方法的类应该加载它自己的库。任何其他因素都会引发这个问题。没有很好的理由分开这个函数。是的,但是如果我这样做,那么如果我只想重新启动web服务,我就必须重新启动整个Tomcat服务,因为我的JNI库被多个类加载器加载。因此,我需要将库加载分离到一个单独的类中。同样的问题。库已加载,但找不到JNI函数。