2009-07-15 79 views
13

我有幾個類使用相同的JNI庫,名爲「jni」。在每一個這些類的,我在類的靜態初始化一個的System.loadLibrary()調用:防止Java多次加載庫

Class class1 { 
    static{ 
     System.loadLibrary("jni"); 
    } 
    ... 
} 

Class class2 { 
    static{ 
     System.loadLibrary("jni"); 
    } 
    ... 
} 

唯一的問題是,我只想要的System.loadLibrary()被調用一次,因爲它可以採取一會兒。有沒有一種簡單而乾淨的方法來防止同一個庫的多重加載?

回答

30

如果庫已經被加載,任何後續調用加載相同的庫將被忽略。

System.loadLibrary

加載由 libname參數指定的系統庫。庫名稱映射到 實際系統庫的 中的方式與系統 相關。

呼叫的System.loadLibrary(名稱)是 實際上等效於呼叫

Runtime.getRuntime().loadLibrary(name) 

Runtime.loadLibrary

荷載與 指定庫名的動態庫。包含本地代碼的文件 從 加載本地文件系統 其中庫文件通常在 獲得。這個過程的細節 是依賴於實現的。從庫名映射到 特定文件名的 以 系統特定的方式完成。

首先,如果有安全管理器, 其checkLink方法以 作爲其參數調用。這可能是 導致安全異常。

方法System.loadLibrary(String) 是調用此方法的常規和方便的 方法。如果 本地方法是在 實現類的使用,標準 策略是將本機代碼 庫文件(稱之爲LIBFILE)和 然後把靜態初始化:

static { System.loadLibrary("LibFile"); } 

在類聲明中。當 類被加載並初始化時,原生方法的必需本機代碼實現 然後將被加載 。

如果此方法是用相同的庫名叫做超過 一次, 第二次及以後的調用是 忽略。

+0

是的 - 你明白了:) – 2009-07-15 18:33:04

+1

這對於System.load也是如此嗎?文檔沒有具體說明。 – 2014-06-10 03:48:41

+0

是的。對於System.load也是如此。 – 2014-09-29 10:11:46

0

我敢肯定,任何後續調用加載已加載的庫沒有任何效果[來源請求]。

這已在ClassLoader類源代碼中驗證過,但我仍在試圖找到一個好的源代碼。

0

創建一個單例類負荷 「JNI」 只有在它的第一個實例,並調用class1的這個單和CLASS2代替的System.loadLibrary( 「JNI」)

2

JavaDocs -

如果使用相同的庫名稱多次調用此方法,則會忽略第二個和後續調用。