Android JAVA层加载动态库原理分析
Author : Aoyousatuo Zhao
http://blog.sina.com.cn/aoyousatuo
在Android应用的开发中我们往往需要加载一些系统的或者自己的或者第三方的动态库来提高代码的运行开发效率。在JAVA层面,Android主要提供了两种加载本地库的方式:
System.loadLibrary以及System.load,
两者最终调用的是Runtime中的相关函数,而者的区别是前者只需要提供动态库名称(不包括lib),后者需要提供动态库的完全路径。下面我就这种方式加载动态库的过程做一个分析。
1.
System类的路径:
./android/libcore/luni/src/main/java/java/lang/System.java
System类的两个方法:
public static
void load(String pathName) {
Runtime.getRuntime().load(pathName,
VMStack.getCallingClassLoader());
}
public static void loadLibrary(String libName) {
Runtime.getRuntime().loadLibrary(libName,
VMStack.getCallingClassLoader());
}
从中我们可以看到本质上是调用了Runtime的相关方法。
2.
Runtime类的路径:
./android/libcore/luni/src/main/java/java/lang/Runtime.java
Runtime类的相关方法:
public void
load(String pathName) {
load(pathName, VMStack.getCallingClassLoader());
}
void
load(String pathName, ClassLoader loader) {
if (pathName == null) {
throw new NullPointerException("pathName == null");
}
String error = nativeLoad(pathName,
loader);
if (error != null) {
throw new UnsatisfiedLinkError(error);
}
}
public void
loadLibrary(String libName) {
loadLibrary(libName, VMStack.getCallingClassLoader());
}
void
loadLibrary(String libraryName, ClassLoader loader) {
if (loader != n