Use j.l.ThreadGroup class directly for GetThreadGroupInfo

We were using the class of the input to GetThreadGroupInfo in some
situations. This could lead to us reading the wrong field or not
finding expected fields. Change to always directly use the
j.l.ThreadGroup class from WellKnownClasses. Also use some handles in
this function.

Test: ./test.py --host
Bug: 140521090
Change-Id: I3560662718311ccc0fa9b906f178407350ce9960
diff --git a/openjdkjvmti/ti_threadgroup.cc b/openjdkjvmti/ti_threadgroup.cc
index e17e61f..f2e5c90 100644
--- a/openjdkjvmti/ti_threadgroup.cc
+++ b/openjdkjvmti/ti_threadgroup.cc
@@ -99,7 +99,10 @@
     return ERR(INVALID_THREAD_GROUP);
   }
 
-  art::ObjPtr<art::mirror::Object> obj = soa.Decode<art::mirror::Object>(group);
+  art::StackHandleScope<2> hs(soa.Self());
+  art::Handle<art::mirror::Class> tg_class(
+      hs.NewHandle(soa.Decode<art::mirror::Class>(art::WellKnownClasses::java_lang_ThreadGroup)));
+  art::Handle<art::mirror::Object> obj(hs.NewHandle(soa.Decode<art::mirror::Object>(group)));
 
   // Do the name first. It's the only thing that can fail.
   {
@@ -107,7 +110,7 @@
         art::jni::DecodeArtField(art::WellKnownClasses::java_lang_ThreadGroup_name);
     CHECK(name_field != nullptr);
     art::ObjPtr<art::mirror::String> name_obj =
-        art::ObjPtr<art::mirror::String>::DownCast(name_field->GetObject(obj));
+        art::ObjPtr<art::mirror::String>::DownCast(name_field->GetObject(obj.Get()));
     std::string tmp_str;
     const char* tmp_cstr;
     if (name_obj == nullptr) {
@@ -129,7 +132,7 @@
     art::ArtField* parent_field =
         art::jni::DecodeArtField(art::WellKnownClasses::java_lang_ThreadGroup_parent);
     CHECK(parent_field != nullptr);
-    art::ObjPtr<art::mirror::Object> parent_group = parent_field->GetObject(obj);
+    art::ObjPtr<art::mirror::Object> parent_group = parent_field->GetObject(obj.Get());
     info_ptr->parent = parent_group == nullptr
                            ? nullptr
                            : soa.AddLocalReference<jthreadGroup>(parent_group);
@@ -137,16 +140,16 @@
 
   // Max priority.
   {
-    art::ArtField* prio_field = obj->GetClass()->FindDeclaredInstanceField("maxPriority", "I");
+    art::ArtField* prio_field = tg_class->FindDeclaredInstanceField("maxPriority", "I");
     CHECK(prio_field != nullptr);
-    info_ptr->max_priority = static_cast<jint>(prio_field->GetInt(obj));
+    info_ptr->max_priority = static_cast<jint>(prio_field->GetInt(obj.Get()));
   }
 
   // Daemon.
   {
-    art::ArtField* daemon_field = obj->GetClass()->FindDeclaredInstanceField("daemon", "Z");
+    art::ArtField* daemon_field = tg_class->FindDeclaredInstanceField("daemon", "Z");
     CHECK(daemon_field != nullptr);
-    info_ptr->is_daemon = daemon_field->GetBoolean(obj) == 0 ? JNI_FALSE : JNI_TRUE;
+    info_ptr->is_daemon = daemon_field->GetBoolean(obj.Get()) == 0 ? JNI_FALSE : JNI_TRUE;
   }
 
   return ERR(NONE);