First pass of ImageWriter

Change-Id: I4f189587a2e3cc1c265200b8fa64321b299947eb
diff --git a/src/class_linker.cc b/src/class_linker.cc
index 64b31a2..50b1a07 100644
--- a/src/class_linker.cc
+++ b/src/class_linker.cc
@@ -43,10 +43,14 @@
   java_lang_Object->descriptor_ = "Ljava/lang/Object;";
   // backfill Object as the super class of Class
   java_lang_Class->super_class_ = java_lang_Object;
+  // mark as non-primitive for object_array_class
+  java_lang_Object->primitive_type_ = Class::kPrimNot;
 
   // object_array_class is for root_classes to provide the storage for these classes
   Class* object_array_class = AllocClass(java_lang_Class);
   CHECK(object_array_class != NULL);
+  object_array_class->descriptor_ = "[Ljava/lang/Object;";
+  object_array_class->component_type_ = java_lang_Object;
 
   // String and char[] are necessary so that FindClass can assign names to members
   Class* java_lang_String = AllocClass(java_lang_Class);
@@ -56,12 +60,15 @@
   java_lang_String->object_size_ = sizeof(String);
   Class* char_array_class = AllocClass(java_lang_Class);
   CHECK(char_array_class != NULL);
+  char_array_class->descriptor_ = "[C";
 
   // int[] and long[] are used for static field storage
   Class* int_array_class = AllocClass(java_lang_Class);
   CHECK(int_array_class != NULL);
+  int_array_class->descriptor_ = "[I";
   Class* long_array_class = AllocClass(java_lang_Class);
   CHECK(long_array_class != NULL);
+  long_array_class->descriptor_ = "[J";
 
   // Field and Method are necessary so that FindClass can link members
   Class* java_lang_reflect_Field = AllocClass(java_lang_Class);
@@ -219,7 +226,7 @@
 }
 
 Class* ClassLinker::AllocClass(Class* java_lang_Class) {
-  return down_cast<Class*>(java_lang_Class->NewInstance());
+  return java_lang_Class->NewInstance()->AsClass();
 }
 
 Class* ClassLinker::AllocClass() {