Index: rvm/src/org/jikesrvm/jni/JNIFunctions.java
===================================================================
--- rvm/src/org/jikesrvm/jni/JNIFunctions.java	(revision 15711)
+++ rvm/src/org/jikesrvm/jni/JNIFunctions.java	(working copy)
@@ -39,6 +39,8 @@
 import org.jikesrvm.runtime.Reflection;
 import org.jikesrvm.runtime.RuntimeEntrypoints;
 import org.jikesrvm.util.AddressInputStream;
+import org.jikesrvm.util.HashSetRVM;
+import org.jikesrvm.util.LinkedListRVM;
 
 import static org.jikesrvm.runtime.SysCall.sysCall;
 import org.vmmagic.pragma.NativeBridge;
@@ -2238,11 +2240,14 @@
       String descriptorString = JNIHelpers.createStringFromC(descriptorAddress);
       Atom descriptor = Atom.findOrCreateAsciiAtom(descriptorString);
 
-      // list of all instance fields including superclasses
-      RVMField[] fields = java.lang.JikesRVMSupport.getTypeForClass(cls).getInstanceFields();
-      for (RVMField f : fields) {
-        if (f.getName() == fieldName && f.getDescriptor() == descriptor) {
-          return f.getId();
+      // search the current and super classes for the instance field.
+      RVMType type = java.lang.JikesRVMSupport.getTypeForClass(cls);
+      if (VM.VerifyAssertions) {VM._assert(type instanceof RVMClass);}
+      for(RVMClass rcls = (RVMClass)type;rcls != null;rcls = rcls.getSuperClass()) {
+        for(final RVMField f: rcls.getDeclaredFields()) {
+          if (!f.isStatic() && f.getName() == fieldName && f.getDescriptor() == descriptor) {
+            return f.getId();
+          }
         }
       }
 
@@ -3434,14 +3439,42 @@
       String descriptorString = JNIHelpers.createStringFromC(descriptorAddress);
       Atom descriptor = Atom.findOrCreateAsciiAtom(descriptorString);
 
-      // list of all instance fields including superclasses
-      RVMField[] fields = java.lang.JikesRVMSupport.getTypeForClass(cls).getStaticFields();
-      for (RVMField field : fields) {
-        if (field.getName() == fieldName && field.getDescriptor() == descriptor) {
-          return field.getId();
+      RVMType type = java.lang.JikesRVMSupport.getTypeForClass(cls);
+      if (VM.VerifyAssertions) {VM._assert(type instanceof RVMClass);}
+      RVMClass rcls = (RVMClass)type;
+      
+      // Search the class tree for the field.
+      if (!rcls.isInterface()) {
+        for(RVMClass icls = rcls; icls != null;icls = icls.getSuperClass()) {
+          for(final RVMField f : icls.getDeclaredFields()) {
+            if (f.isStatic() && (f.getName() == fieldName) && (f.getDescriptor() == descriptor)) {
+              return f.getId();
+            }
+          }
         }
       }
 
+      // Search the interfaces for the field.
+      HashSetRVM<RVMClass> visited = new HashSetRVM<RVMClass>();
+      LinkedListRVM<RVMClass> worklist = new LinkedListRVM<RVMClass>();
+      for(final RVMClass icls :rcls.getDeclaredInterfaces()) {
+        worklist.add(icls);  
+      }
+      while(!worklist.isEmpty()) {
+        RVMClass icls = worklist.remove(0);
+        visited.add(icls);
+        for(final RVMField f: icls.getDeclaredFields()) {
+          if ((f.getName() == fieldName) && (f.getDescriptor() == descriptor)) {
+            return f.getId();
+          }
+        }
+        for(final RVMClass sup : icls.getDeclaredInterfaces()) {
+          if (!visited.contains(sup)) {
+            worklist.add(sup);
+          }
+        }
+      }
+
       env.recordException(new NoSuchFieldError(fieldString + ", " + descriptorString + " of " + cls));
       return 0;
     } catch (Throwable unexpected) {

