【问题标题】:How to load native lib in android with static{System.loadLibrary()}如何使用 static{System.loadLibrary()} 在 android 中加载本机库
【发布时间】:2013-05-02 09:24:38
【问题描述】:
我在研究android源代码,发现framework中有很多地方使用native code而不使用static{System.loadLibrary()}。
例如,在 SystemServer.java 中,调用了本地方法“init1(args)”,但文件中没有 static{System.loadLibrary()}。如何在没有 static{System.loadLibrary()} 的情况下加载本机代码?谢谢。
【问题讨论】:
标签:
android
java-native-interface
【解决方案1】:
本机库对于整个应用程序只需加载一次,因此它可能已经被另一个之前已实例化的类加载。请注意,这不是最佳实践,因为它对调用类的顺序进行了假设!
避免这种情况的常用技术是创建一个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();},就可以确保该库已加载(并且仅加载一次)。
【解决方案2】:
对于仍然发现这个的人,您可以简单地使用:
OpenCVLoader.initDebug()
在
org.opencv.android.OpenCVLoader
方法文档:
从当前应用程序包中加载并初始化 OpenCV 库。粗略地说,它类似于 system.loadLibrary("opencv_java")。