3

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

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

4

2 回答 2

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();}每个需要使用本机函数的类,您就可以确保该库已被加载(并且仅加载一次)。

于 2013-05-02T09:36:21.693 回答
0

对于仍然发现这一点的人,您可以简单地使用:

OpenCVLoader.initDebug()

org.opencv.android.OpenCVLoader

该方法的文档:

从当前应用程序包加载和初始化 OpenCV 库。粗略地说,它类似于 system.loadLibrary("opencv_java")。

于 2022-01-05T08:43:04.147 回答