OSDN Git Service

Futher oat_process debugging
authorBrian Carlstrom <bdc@google.com>
Mon, 26 Sep 2011 23:48:59 +0000 (16:48 -0700)
committerBrian Carlstrom <bdc@google.com>
Mon, 26 Sep 2011 23:48:59 +0000 (16:48 -0700)
Change-Id: I7a25933939cf353e6dd67a80daebd6944b2448ac

oat_process/app_main.cpp

index 45950cd..9ccdf16 100644 (file)
@@ -99,15 +99,35 @@ public:
         jmethodID put = env->GetMethodID(Map,
                                          "put",
                                          "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
-
-        jobject application_loaders = env->CallStaticObjectMethod(ApplicationLoaders, getDefault);
-        jobject loaders = env->GetObjectField(application_loaders, mLoaders);
-        jobject boot_class_loader = env->CallStaticObjectMethod(BootClassLoader, getInstance);
+        jclass BaseDexClassLoader = env->FindClass("dalvik/system/BaseDexClassLoader");
+        jfieldID originalPath = env->GetFieldID(BaseDexClassLoader, "originalPath", "Ljava/lang/String;");
+        jfieldID pathList = env->GetFieldID(BaseDexClassLoader, "pathList", "Ldalvik/system/DexPathList;");
+        jclass DexPathList = env->FindClass("dalvik/system/DexPathList");
+        jmethodID init = env->GetMethodID(DexPathList,
+                                          "<init>",
+                                          "(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)V");
+
+        // Set the parent of our pre-existing ClassLoader to the non-null BootClassLoader.getInstance()
         const art::ClassLoader* class_loader_object = art::Thread::Current()->GetClassLoaderOverride();
         jobject class_loader = art::AddLocalReference<jobject>(env, class_loader_object);
+        jobject boot_class_loader = env->CallStaticObjectMethod(BootClassLoader, getInstance);
         env->SetObjectField(class_loader, parent, boot_class_loader);
-        jstring apk = env->NewStringUTF("/system/app/Calculator.apk");
-        env->CallObjectMethod(loaders, put, apk, class_loader);
+
+        // Create a DexPathList
+        jstring dex_path = env->NewStringUTF("/system/app/Calculator.apk");
+        jstring library_path = env->NewStringUTF("/data/data/com.android.calculator2/lib");
+        jobject dex_path_list = env->NewObject(DexPathList, init,
+                                               boot_class_loader, dex_path, library_path, NULL);
+
+        // Set DexPathList into our pre-existing ClassLoader
+        env->SetObjectField(class_loader, pathList, dex_path_list);
+        env->SetObjectField(class_loader, originalPath, dex_path);
+
+        // Stash our pre-existing ClassLoader into ApplicationLoaders.getDefault().mLoaders
+        // under the expected name.
+        jobject application_loaders = env->CallStaticObjectMethod(ApplicationLoaders, getDefault);
+        jobject loaders = env->GetObjectField(application_loaders, mLoaders);
+        env->CallObjectMethod(loaders, put, dex_path, class_loader);
     }
 
     virtual void onStarted()