Filling in some Class, Method, and Field native code needed during startup and I/O

Change-Id: Ia2f2a0ec295d1bd848e6f65254bd9fec2fde56f6
diff --git a/src/java_lang_Class.cc b/src/java_lang_Class.cc
index 7648425..4bc1caa 100644
--- a/src/java_lang_Class.cc
+++ b/src/java_lang_Class.cc
@@ -60,6 +60,27 @@
   return env->NewObjectArray(0, java_lang_Class_class, NULL);
 }
 
+jobject Class_getDeclaredField(JNIEnv* env, jclass java_lang_Class_class, jclass jklass, jobject jname) {
+  Class* klass = Decode<Class*>(env, jklass);
+  DCHECK(klass->IsClass());
+  String* name = Decode<String*>(env, jname);
+  DCHECK(name->IsString());
+
+  for (size_t i = 0; i < klass->NumInstanceFields(); ++i) {
+    Field* f = klass->GetInstanceField(i);
+    if (f->GetName()->Equals(name)) {
+      return AddLocalReference<jclass>(env, f);
+    }
+  }
+  for (size_t i = 0; i < klass->NumStaticFields(); ++i) {
+    Field* f = klass->GetStaticField(i);
+    if (f->GetName()->Equals(name)) {
+      return AddLocalReference<jclass>(env, f);
+    }
+  }
+  return NULL;
+}
+
 jclass Class_getDeclaringClass(JNIEnv* env, jobject javaThis) {
   UNIMPLEMENTED(WARNING) << "needs annotations";
   return NULL;
@@ -148,7 +169,7 @@
   NATIVE_METHOD(Class, getDeclaredClasses, "(Ljava/lang/Class;Z)[Ljava/lang/Class;"),
   //NATIVE_METHOD(Class, getDeclaredConstructorOrMethod, "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Member;"),
   //NATIVE_METHOD(Class, getDeclaredConstructors, "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;"),
-  //NATIVE_METHOD(Class, getDeclaredField, "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;"),
+  NATIVE_METHOD(Class, getDeclaredField, "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/reflect/Field;"),
   //NATIVE_METHOD(Class, getDeclaredFields, "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;"),
   //NATIVE_METHOD(Class, getDeclaredMethods, "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;"),
   NATIVE_METHOD(Class, getDeclaringClass, "()Ljava/lang/Class;"),