当Common classloader加载库时,无法调用JNI方法

时间:2015-04-17 09:21:10

标签: java c++ tomcat

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

我认为解决此问题的最佳做法是从另一个类加载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 ();
}

Start函数在JNI库中定义为Java_com_mywebservice_MyWebServiceImpl_Start并被调用。

以下代码对我不起作用。首先,加载器类进入$(TOMCAT_HOME)/ lib作为MyLoader.jar。

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,JDK 6u45,Eclipse Kepler上使用Tomcat 6.0.43。

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

1 个答案:

答案 0 :(得分:0)

该类包含本机方法应该加载自己的库。其他任何东西都在邀请这个问题。没有充分的理由将这个功能分开。