Java JNI调用加载库

10

如果我有两个Java类,它们都有对编译后的C代码的本地调用,并且我在另一个类中调用这两个类,那么它会影响内存吗?例如,我有Class A和Class B,它们都调用本地函数。它们设置如下:

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

    }
}
4个回答

10

不,这没关系。在同一个类加载器中调用loadLibrary()多次是无害的。

根据Runtime.loadLibrary(String)的文档(被System.loadLibrary(String)调用):

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

2
最好由使用库的类来加载库。如果必须由调用者加载库,则可以在不加载库的情况下调用本地方法。

2
Jni库是动态库。我认为它们必须是这样才能被loadLibrary加载。动态库的一个优点是,如果它们已经加载到内存中,那么就会使用该副本而不是重新加载。因此,您可以使用两个loadlibrary调用。
另一个问题是,如果您将loadlibrary调用放在类C中,就会破坏其他两个类的封装性。在任何大型项目中,最终会有人调用类a或类b中的原生调用,而不通过类c。这将无法正常工作。

0

看起来创建一个NdkFoo类是明智的,而且每个方法都应该是本地方法。这样从A中就可以使用。

NdkFoo.getInstance().mathMethod();

而B可以做到

NdkFoo.getInstance().nonMathMethod();

这也使得创建本地库名称与支持Java类名称一致。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接