2011-12-08 75 views
7

如果我有兩個Java類編譯C代碼的本地調用,並且我調用另一個類中的這些類,它會影響內存嗎?例如,我有兩個調用本機函數的A類和B類。他們建立這樣的:Java JNI調用來加載庫

public class A{ 
    // declare the native code function - must match ndkfoo.c 
    static { 
     System.loadLibrary("ndkfoo"); 
    } 

    private static native double mathMethod(); 

    public A() {} 

    public double getMath() { 
      double dResult = 0; 
      dResult = mathMethod(); 
      return dResult; 
    } 
} 


public class B{ 
    // declare the native code function - must match ndkfoo.c 
    static { 
     System.loadLibrary("ndkfoo"); 
    } 

    private static native double nonMathMethod(); 

    public B() {} 

    public double getNonMath() { 
      double dResult = 0; 
      dResult = nonMathMethod(); 
      return dResult; 
    } 
} 

C類則同時呼籲,因爲他們都做一個靜態調用加載庫將在C級是怎麼回事?或者是它最好有C級呼叫的System.loadLibrary(...?

public class C{ 
    // declare the native code function - must match ndkfoo.c 
    // So is it beter to declare loadLibrary here than in each individual class? 
    //static { 
    // System.loadLibrary("ndkfoo"); 
    //} 
    // 

    public C() {} 

    public static void main(String[] args) { 
     A a = new A(); 
     B b = new B(); 
     double result = a.getMath() + b.getNonMath(); 

    } 
} 

回答

7

不,沒關係。在同一個類加載器中多次調用loadLibrary()是無害的。

從文檔Runtime.loadLibrary(String),其通過的System.loadLibrary(字符串)被叫:

If this method is called more than once with the same library name, 
    the second and subsequent calls are ignored. 
1

其更好地有一個使用該庫的類加載庫。如果你對來電者加載你讓它庫可以調用本地方法,而無需加載庫。

0

好像和NdkFoo類將是審慎的,並有充分的方法是原生一個,然後從A,你可以使用

NdkFoo.getInstance().mathMethod(); 

和B可以做

NdkFoo.getInstance().nonMathMethod(); 

它還使創建與支持java類名稱一致的本機庫名稱。

1

Jni庫是動態庫。我認爲他們必須爲了被loadLibrary加載。動態庫的優點之一是,如果它們已經被加載到內存中,則使用該副本而不是被重新加載。所以你可以使用這兩個loadlibrary調用。

另一個問題是,如果你把類庫C中的loadlibrary調用,你毀了其他兩個類的封裝。在任何大型項目中,有人最終都會打電話給a班或b班的本地電話,而無需通過c班。這不會很好。