2011-12-08 9 views
7

¿Tiene impacto en la memoria si tengo dos clases Java que tienen llamadas nativas al código C compilado y las llamo a ambas clases en otra clase? Por ejemplo, tengo clase A y clase B con ambas llamadas a funciones nativas. Son configuración como esta:Llamada JNI de Java para cargar la biblioteca

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; 
    } 
} 

Clase C luego se llama a ambos, ya que ambos hacen una llamada estática para cargar la biblioteca será el caso en la clase C? ¿O es mejor tener la clase C System.loadLibrary llamada (...?

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(); 

    } 
} 

Respuesta

7

No, no importa. Es inofensivo llamar a loadLibrary() más de una vez en el mismo cargador de clases.

De la documentación para Runtime.loadLibrary(String), que es llamada por System.loadLibrary (String):

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

Su mejor tener la clase que utiliza la biblioteca, cargar la biblioteca. Si tiene la persona que llama cargar la biblioteca lo haces posible llamar a los métodos nativos sin cargar la biblioteca.

0

que parece ser y NdkFoo clase sería prudente, y tienen todos los métodos de ser un nativo. Luego de la a usted podría utilizar

NdkFoo.getInstance().mathMethod(); 

y B podría hacer

NdkFoo.getInstance().nonMathMethod(); 

También hace que la creación del nombre de la biblioteca nativa sea coherente con el nombre de la clase java de respaldo.

1

Jni libs son bibliotecas dinámicas. Creo que tendrían que estar para ser cargados por loadLibrary. Una de las ventajas de las bibliotecas dinámicas es que, si ya están cargadas en la memoria, esa copia se usa en lugar de volver a cargarse. Entonces puede usar las dos llamadas a la biblioteca de carga.

El otro problema es que si coloca la llamada loadlibrary en la clase C, ha arruinado la encapsulación de las otras dos clases. En cualquier proyecto grande, alguien eventualmente va a llamar a una de las llamadas nativas en clase a o clase b sin pasar por la clase c. Eso no funcionará tan bien.

Cuestiones relacionadas