如何使用static {System.loadLibrary()}在android中加载本机lib

时间:2013-05-02 09:24:39

标签: android java-native-interface

我正在研究android源代码,我发现框架中有很多地方使用本机代码而不使用静态{System.loadLibrary()}。

例如,在SystemServer.java中,调用了本机方法“init1(args)”,但文件中没有静态{System.loadLibrary()}。如何在没有静态{System.loadLibrary()}的情况下加载本机代码?感谢。

1 个答案:

答案 0 :(得分:2)

本地库只需要为整个应用程序加载一次,因此它可能已经被另一个已经实例化过的类加载了。请注意,这不是最佳实践,因为它会对调用类的顺序进行假设!

避免这种情况的一种常用技术是创建一个Loader类,如下所示:

class Loader {
    private static boolean done = false;

    protected static synchronized void load() {
        if (done)
            return;

        System.loadLibrary("library_name");

        done = true;
    }
}

这样,如果在每个需要使用本机函数的类上调用static{Loader.load();},则确保已加载库(并且只加载一次)。