2011-12-08 53 views
7

コンパイルされたCコードへのネイティブ呼び出しを持つ2つのJavaクラスがあり、それらのクラスを別のクラスで呼び出すと、メモリに影響しますか?たとえば、クラス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()を複数回呼び出すことは無害です。

If this method is called more than once with the same library name, 
    the second and subsequent calls are ignored. 
:System.loadLibraryを(文字列)によって呼び出され Runtime.loadLibrary(String)のドキュメントから、

1

その優れたを持っているライブラリをロードすることをお勧めします。あなたはそれを作るライブラリをロード呼び出し元にしている場合ライブラリをロードせずにネイティブメソッドを呼び出すことが可能。

0

のように思えるとNdkFooクラスが賢明であり、すべてのメソッドは、ネイティブ一つであるだろう。そして、Aからあなたが

NdkFoo.getInstance().mathMethod(); 

とBを使用することができますが行うことができます

また、バッキングJavaクラス名と一貫したネイティブライブラリ名を作成します。

1

Jniライブラリは動的ライブラリです。私は彼らがloadLibraryによって読み込まれる必要があると思います。ダイナミックライブラリの利点の1つは、既にメモリにロードされている場合、そのコピーがリロードされる代わりに使用されることです。したがって、2つのloadlibrary呼び出しを使用できます。

もう1つの問題は、クラスCでloadlibrary呼び出しを行うと、他の2つのクラスのカプセル化が破棄されたことです。大規模なプロジェクトでは、クラスcを経由することなく、最終的にクラスaまたはクラスbのネイティブコールのいずれかを呼び出すことになります。それはうまくいきません。

関連する問題