如何根据用例从Java加载本机库?

时间:2018-02-12 09:12:45

标签: java java-native-interface native loadlibrary

我有一个用例,具体取决于我要加载库。

if(useCase) {
  Static { System.loadLibrary("a") };
}
else {
  Static { System.loadLibrary("b") }; 
}

直到现在,我只有一个要加载的库,所以我在类声明中加载它静态但现在我有这个用例,并且根据它我需要加载库。

我试图只在构造函数中加载库,但是不允许在构造函数中使用任何静态声明,我很困惑其他方法可以实现相同的目标吗?

我想将库加载为仅静态。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

请使用自定义类加载器。以下是更多信息的链接 http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html

答案 1 :(得分:0)

static {} (类)构造函数中调用loadLibrary()很容易,因为这样可以确保实现类的本机方法的代码在类加载器时可用需要它来初始化类,如下所示:

public class ClassWithNativeMethods {
    static {
        System.loadLibrary("a");
    }
    native void method1();
}

class ClassThatUsesClassWithNativeMethods {
    ClassWithNativeMethods field = new ClassWithNativeMethods();
}

如果您的Java有两种不同的方案涉及加载不同的本机库,您可以在加载此类之前加载此库:

public class ClassWithNativeMethods {
    native void method1();
}

class ClassThatUsesClassWithNativeMethods {
    ClassWithNativeMethods field;

    public ClassThatUsesClassWithNativeMethods(bool useCase) {
        if (useCase) {
            System.loadLibrary("a");
        }
        else {
            System.loadLibrary("b");
        }
        field = new ClassWithNativeMethods();
    }
}

如果条件静态,您可以在静态构造函数中使用它:

public class ClassWithNativeMethods {
    static {
        if (BuildConfig.useCase) {
            System.loadLibrary("a");
        else {
            System.loadLibrary("b");
        }
    }
    native void method1();
}