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