JNI(Java Native
Interface)應用程序一般是一個Java類,在這個類中定義了幾個native方法,並在類的初始化過程中加載動態庫,例如下面這個類
public class SystemInfo{
static {
System.loadLibrary("SystemInfo");
}
public static native long getPhysicalMemory();
}
當Web項目用到該類並由於其他類的修改導致項目(context)重新加載,這個時候SystemInfo的初始化就會出異常,直接導致SystemInfo這個不可用,因為JNI中不允許一個動態庫被加載兩次,而且也沒法通過程序來卸載前面所加載的動態庫。
怎麼來解決因為context重新加載而導致JNI類無法試用的問題呢?
其實這個問題不難,我們只要不讓JNI類重新加載即可。但是一般的應用服務器對Web項目中文件都是默認重新加載的,例如WEB-INF/classes以及WEB-INF/lib目錄。如此我們便不能將JNI類放在這兩個目錄下,但是我們又必須保證這個JNI類能被Web項目的其他類引用到,因此這就需要參照不同應用服務器的類路徑的說明進行設置,對於Tomcat而言,我們可以把這個JNI類單獨打包並放在{tomcat}commonlib目錄下,並刪除web項目中的這個JNI類即可解決前面提到的問題。