gpt4 book ai didi

android - dalvik 是如何找到库的?

转载 作者:太空狗 更新时间:2023-10-29 16:05:47 27 4
gpt4 key购买 nike

首先,在 System.java 中,它调用 Runtime 来加载库。

public static void loadLibrary(String libName) {
SecurityManager smngr = System.getSecurityManager();
if (smngr != null) {
smngr.checkLink(libName);
}
Runtime.getRuntime().loadLibrary(libName, VMStack.getCallingClassLoader());
}

其次,它调用 VMStack.getCallingClassLoader() 来查找库。

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 构造函数(从 PathClassLoaderDexClassLoader)。

对于 Android 应用,请查看使用 PathClassLoaderandroid.app.ApplicationLoaders。如果你追溯得足够远,你会看到正在从 ApplicationInfo.nativeLibraryDir 检索目录。

编辑:更深入地解决评论...

/system/lib 来自 java.library.path 属性,核心库从 LD_LIBRARY_PATH 环境变量中提取该属性。特定于应用程序的库目录由框架配置。

PackageManagerService构造函数在mAppLibInstallDir中设置lib路径,setInternalAppNativeLibraryPath()配置nativeLibraryDir

DexPathList.splitLibraryPath()java.library.path 路径与特定于 APK 的路径相结合。有关订购的说明,请参阅此处的评论。

关于android - dalvik 是如何找到库的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15701861/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com