Support using opaque JNI ids

Currently JNI ids (jmethodID &  jfieldID) are created by simply
casting the corresponding ART structure pointer. This is great for
simplicity but means we are prevented from performing operations that
could change these pointer values. To support these use-cases add
support for loading the runtime with a layer of indirection between
these ids and the internal art data types.

Currently the JNI id type can be toggled only by passing the new
'-Xopaque-jni-ids:{true,false}' flag during startup.

This changes the --debuggable test configuration to pass
'-Xopaque-jni-ids:true' in order to get test coverage of this feature
using the 'art-jit' configuration.

Test: ./test.py --host --debuggable
Test: ./test.py --host --debuggable --jit-on-first-use
Test: ./test/testrunnner/run_build_test_target.py art-jit
Bug: 134162467
Change-Id: Id8c8cb9a5b8ff18dc2f40892fae2d344a7214f44
diff --git a/runtime/mirror/class_ext.h b/runtime/mirror/class_ext.h
index 70bea33..6fb225f 100644
--- a/runtime/mirror/class_ext.h
+++ b/runtime/mirror/class_ext.h
@@ -48,6 +48,33 @@
 
   template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
            ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
+  ObjPtr<PointerArray> EnsureInstanceJFieldIDsArrayPresent(size_t count)
+      REQUIRES_SHARED(Locks::mutator_lock_);
+
+  template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
+           ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
+  ObjPtr<PointerArray> GetInstanceJFieldIDs() REQUIRES_SHARED(Locks::mutator_lock_);
+
+  template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
+           ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
+  ObjPtr<PointerArray> EnsureStaticJFieldIDsArrayPresent(size_t count)
+      REQUIRES_SHARED(Locks::mutator_lock_);
+
+  template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
+           ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
+  ObjPtr<PointerArray> GetStaticJFieldIDs() REQUIRES_SHARED(Locks::mutator_lock_);
+
+  template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
+           ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
+  ObjPtr<PointerArray> EnsureJMethodIDsArrayPresent(size_t count)
+      REQUIRES_SHARED(Locks::mutator_lock_);
+
+  template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
+           ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
+  ObjPtr<PointerArray> GetJMethodIDs() REQUIRES_SHARED(Locks::mutator_lock_);
+
+  template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
+           ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
   ObjPtr<PointerArray> GetObsoleteMethods() REQUIRES_SHARED(Locks::mutator_lock_);
 
   ObjPtr<Object> GetOriginalDexFile() REQUIRES_SHARED(Locks::mutator_lock_);
@@ -82,19 +109,36 @@
   static ObjPtr<ClassExt> Alloc(Thread* self) REQUIRES_SHARED(Locks::mutator_lock_);
 
  private:
+  template<VerifyObjectFlags kVerifyFlags = kDefaultVerifyFlags,
+           ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
+  ObjPtr<PointerArray> EnsureJniIdsArrayPresent(MemberOffset off, size_t count)
+      REQUIRES_SHARED(Locks::mutator_lock_);
+
   // Field order required by test "ValidateFieldOrderOfJavaCppUnionClasses".
+  // An array containing the jfieldIDs assigned to each field in the corresponding position in the
+  // classes ifields_ array or '0' if no id has been assigned to that field yet.
+  HeapReference<PointerArray> instance_jfield_ids_;
+
+  // An array containing the jmethodIDs assigned to each method in the corresponding position in
+  // the classes methods_ array or '0' if no id has been assigned to that method yet.
+  HeapReference<PointerArray> jmethod_ids_;
+
   HeapReference<ObjectArray<DexCache>> obsolete_dex_caches_;
 
   HeapReference<PointerArray> obsolete_methods_;
 
   HeapReference<Object> original_dex_file_;
 
+  // An array containing the jfieldIDs assigned to each field in the corresponding position in the
+  // classes sfields_ array or '0' if no id has been assigned to that field yet.
+  HeapReference<PointerArray> static_jfield_ids_;
+
   // The saved verification error of this class.
   HeapReference<Object> verify_error_;
 
   // Native pointer to DexFile and ClassDef index of this class before it was JVMTI-redefined.
-  int64_t pre_redefine_dex_file_ptr_;
   int32_t pre_redefine_class_def_index_;
+  int64_t pre_redefine_dex_file_ptr_;
 
   friend struct art::ClassExtOffsets;  // for verifying offset information
   DISALLOW_IMPLICIT_CONSTRUCTORS(ClassExt);