Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当公共类加载器加载库时,无法调用JNI方法_Java_C++_Tomcat - Fatal编程技术网

Java 当公共类加载器加载库时,无法调用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

我正在尝试部署一个web服务,它使用一个JNI库在Windows上部署Tomcat 6,并且在Tomcat Manager中重新启动应用程序时,遇到了另一个类加载器中已加载的不受欢迎的UnsatifiedLinkError问题

我认为解决这个问题的最佳实践是从另一个类加载JNI库,该类在jar文件中指定,并放入$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,并被调用

下面的代码对我不起作用。首先,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函数。