[英]How does dalvik findlibrary?
首先,在System.java中,它将Runtime调用到loadLibrary。
public static void loadLibrary(String libName) {
SecurityManager smngr = System.getSecurityManager();
if (smngr != null) {
smngr.checkLink(libName);
}
Runtime.getRuntime().loadLibrary(libName, VMStack.getCallingClassLoader());
}
第二,它将VMStack.getCallingClassLoader()调用到findLibrary。
void loadLibrary(String libraryName, ClassLoader loader) {
if (loader != null) {
String filename = loader.findLibrary(libraryName);
if (filename == null) {
throw new UnsatisfiedLinkError("Couldn't load " + libraryName + ": " +
"findLibrary returned null");
}
//....
}
}
所以,我认为VMStack.getCallingClassLoader()
是最有意义的。 但是在其jni文件dalvik_system_VMStack.cpp中 , Dalvik_dalvik_system_VMStack_getCallingClassLoader
函数很难学习。 最后,dalvik如何找到图书馆?
static void Dalvik_dalvik_system_VMStack_getCallingClassLoader(const u4* args,
JValue* pResult){
ClassObject* clazz =
dvmGetCaller2Class(dvmThreadSelf()->interpSave.curFrame);
UNUSED_PARAMETER(args);
if (clazz == NULL)
RETURN_PTR(NULL);
RETURN_PTR(clazz->classLoader);
}
VMStack.getCallingClassLoader()
返回声明调用当前方法的方法的类的类加载器。 换句话说,如果我的函数foo()
调用Runtime.loadLibrary()
,它将返回foo
的类加载器。
所有这一切都是为了确保库是在调用findLibrary
的人的上下文中加载的,而不是在java.lang.Runtime
的上下文中。
findLibrary()
很有可能由BaseDexClassLoader
实现,它调用DexPathList.findLibrary()
来完成实际的工作。 有趣的是,遍历nativeLibraryDirectories
,它从libraryPath
参数初始化为BaseDexClassLoader
构造函数(从PathClassLoader
或DexClassLoader
)。
对于Android应用程序,请查看android.app.ApplicationLoaders
,它使用PathClassLoader
。 如果您追溯到足够远,您将看到从ApplicationInfo.nativeLibraryDir
中检索的目录。
编辑:更深入地发表评论......
/system/lib
来自java.library.path
属性,核心库从LD_LIBRARY_PATH
环境变量中提取该属性。 特定于应用程序的库目录由框架配置。
PackageManagerService
构造函数在mAppLibInstallDir
设置lib路径, setInternalAppNativeLibraryPath()
配置nativeLibraryDir
。
DexPathList.splitLibraryPath()
将java.library.path
路径与特定于APK的路径组合在一起。 有关订购的说明,请参阅那里的评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.