我正在研究android源代码,我发现框架中有很多地方使用本机代码而不使用静态{System.loadLibrary()}。
例如,在SystemServer.java中,调用了本机方法“init1(args)”,但文件中没有静态{System.loadLibrary()}。如何在没有静态{System.loadLibrary()}的情况下加载本机代码?感谢。
答案 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();}
,则确保已加载库(并且只加载一次)。