diff -uNr japhar/lib/libjni/src/jnirefl.c japhar-new/lib/libjni/src/jnirefl.c
--- japhar/lib/libjni/src/jnirefl.c	Sun Dec  6 14:34:57 1998
+++ japhar-new/lib/libjni/src/jnirefl.c	Sun Dec  6 14:12:11 1998
@@ -35,21 +35,15 @@
 jmethodID
 FromReflectedMethod(JNIEnv *env, jobject method)
 {
-  jint slot;
-  jobject clazz;
-  ClazzFile *cf;
-  jclass method_class = (*env)->GetObjectClass(env, method);
-  jfieldID slot_field = (*env)->GetFieldID(env, method_class,
-      "slot", "I");
-  jfieldID clazz_field = (*env)->GetFieldID(env, method_class,
-      "clazz", "Ljava/lang/Class;");
-
-  slot = (*env)->GetIntField(env, method, slot_field);
-  clazz = (*env)->GetObjectField(env, method, clazz_field);
-
-  cf = jclass_to_clazzfile(env, clazz);
-
-  return cf->methods[slot];
+  /* Since a Method is only valid for a single Class and its
+   * ancestors and descendants which have that method (and I'm
+   * not even sure about the ancestors part), the jmethodID
+   * returned will always be the same (jmethodIDs are likewise
+   * valid for ancestors and descendants of a single Class).
+   * Thus it is safe to cache the jmethodID.
+   * Same argument is valid for Field/jfieldID.
+   */
+  return (jmethodID) NSA_GetNativeState(method);
 }
 
 /**
@@ -59,21 +53,7 @@
 jfieldID
 FromReflectedField(JNIEnv *env, jobject field)
 {
-  jint slot;
-  jobject clazz;
-  ClazzFile *cf;
-  jclass field_class = (*env)->GetObjectClass(env, field);
-  jfieldID slot_field = (*env)->GetFieldID(env, field_class,
-      "slot", "I");
-  jfieldID clazz_field = (*env)->GetFieldID(env, field_class,
-      "clazz", "Ljava/lang/Class;");
-
-  slot = (*env)->GetIntField(env, field, slot_field);
-  clazz = (*env)->GetObjectField(env, field, clazz_field);
-
-  cf = jclass_to_clazzfile(env, clazz);
-
-  return cf->fields[slot];
+  return (jfieldID) NSA_GetNativeState(field);
 }
 
 /**
diff -uNr japhar/lib/libruntime/nativeglue.c japhar-new/lib/libruntime/nativeglue.c
--- japhar/lib/libruntime/nativeglue.c	Sun Dec  6 14:34:45 1998
+++ japhar-new/lib/libruntime/nativeglue.c	Sun Dec  6 14:12:13 1998
@@ -622,14 +622,6 @@
   jobjectArray exception_array;
   jobjectArray param_array;
   int p;
-  int slot;
-
-  /* Determine method's slot inside class */
-  for (slot = 0; slot < clazz->num_methods; ++slot) {
-    if (clazz->methods[slot] == method) {
-	  break;
-	}
-  }
 
   /*
    * We use the NULL-ness of name_field to determine if we are
@@ -674,7 +666,7 @@
   }
   param_array = (*env)->NewGlobalRef(env, param_array);
   
-  (*env)->SetIntField(env, rmethod, slot_field, slot);
+  NSA_SetNativeState(rmethod, methodID);
   (*env)->SetObjectField(env, rmethod, clazz_field,
 			 clazzfile_to_jclass(env, clazz));
   (*env)->SetObjectField(env, rmethod, exceptionTypes_field,
@@ -701,21 +693,14 @@
   jclass type;
   FieldStruct *field = (FieldStruct *) fieldID;
   ClazzFile *clazz = field->clazz;
-  int slot;
 
-  /* Determine field's slot inside class */
-  for (slot = 0; slot < clazz->num_fields; ++slot) {
-    if (clazz->fields[slot] == field) {
-	  break;
-	}
-  }
   rfield = (*env)->NewObject(env, field_class, field_ctor);
   name = (*env)->NewStringUTF(env, field->name);
   type = sig_to_jclass(env, field->sig);
 
   name = (*env)->NewGlobalRef(env, name);
   (*env)->SetObjectField(env, rfield, name_field, name);
-  (*env)->SetIntField(env, rfield, slot_field, slot);
+  NSA_SetNativeState(rfield, fieldID);
   (*env)->SetObjectField(env, rfield, clazz_field,
 			 clazzfile_to_jclass(env, clazz));
   (*env)->SetObjectField(env, rfield, type_field, type);
