Java JNI调用加载库

Java JNI调用加载库,java,loadlibrary,java-native-interface,Java,Loadlibrary,Java Native Interface,如果我有两个Java类,它们对已编译的C代码进行本机调用,而我在另一个类中调用这两个类,会影响内存吗?例如,我有一个类A和一个类B,它们都调用本机函数。它们的设置如下: public class A{ // declare the native code function - must match ndkfoo.c static { System.loadLibrary("ndkfoo"); } private static native dou

如果我有两个Java类,它们对已编译的C代码进行本机调用,而我在另一个类中调用这两个类,会影响内存吗?例如,我有一个类A和一个类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(…)更好


最好让使用库的类加载库。如果必须调用方加载库,则可以在不加载库的情况下调用本机方法。

看起来像是,并且
NdkFoo
类会比较谨慎,并且每个方法都是本机方法。然后从

NdkFoo.getInstance().mathMethod();
B可以吗

NdkFoo.getInstance().nonMathMethod();

它还使创建本机库名称与支持的java类名一致。

Jni库是动态库。我认为它们必须是动态库才能由loadLibrary加载。动态库的优点之一是,如果它们已经加载到内存中,则会使用该副本,而不是重新加载。因此,您可以使用两个loadlibrary调用


另一个问题是,如果将loadlibrary调用放在类C中,则破坏了其他两个类的封装。在任何大型项目中,最终都会有人在不经过类C的情况下调用类a或类b中的一个本机调用。这不会很好地工作。

不,没关系。调用load是无害的库()在同一类加载器中多次出现

从的文档中,由System.loadLibrary(字符串)调用:

NdkFoo.getInstance().nonMathMethod();
   If this method is called more than once with the same library name, 
   the second and subsequent calls are ignored.