2015-04-17 76 views
0

我試圖要部署的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

類包含本地方法應該加載自己的圖書館。其他任何事情都會引發這個問題。沒有理由分開這個功能。

+0

是的,但如果我這樣做,那麼如果我只想重啓我的Web服務,由於我的JNI庫被多個類加載器加載,我必須重新啓動整個Tomcat服務。因此,爲什麼我需要將庫加載分離到一個單獨的類中。 – rushman

+0

例如,請查看此主題:http://stackoverflow.com/a/13242602/1010617 – rushman