まず、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 findLibrary の方法は?
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);
}