我正在研究android源代码,我发现框架中有很多地方使用本机代码而不使用静态{System.loadLibrary()}。
例如,在 SystemServer.java 中,调用了本地方法“init1(args)”,但文件中没有 static{System.loadLibrary()}。如何在没有 static{System.loadLibrary()} 的情况下加载本机代码?谢谢。
我正在研究android源代码,我发现框架中有很多地方使用本机代码而不使用静态{System.loadLibrary()}。
例如,在 SystemServer.java 中,调用了本地方法“init1(args)”,但文件中没有 static{System.loadLibrary()}。如何在没有 static{System.loadLibrary()} 的情况下加载本机代码?谢谢。
对于整个应用程序,本机库只需加载一次,因此它可能已经被另一个之前已实例化的类加载。请注意,这不是最佳实践,因为它对调用类的顺序进行了假设!
避免这种情况的常用技术是创建这样的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();}
每个需要使用本机函数的类,您就可以确保该库已被加载(并且仅加载一次)。
对于仍然发现这一点的人,您可以简单地使用:
OpenCVLoader.initDebug()
在
org.opencv.android.OpenCVLoader
该方法的文档:
从当前应用程序包加载和初始化 OpenCV 库。粗略地说,它类似于 system.loadLibrary("opencv_java")。