1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #include "java_lang_Class.h"
18*795d594fSAndroid Build Coastguard Worker
19*795d594fSAndroid Build Coastguard Worker #include <iostream>
20*795d594fSAndroid Build Coastguard Worker
21*795d594fSAndroid Build Coastguard Worker #include "art_field-inl.h"
22*795d594fSAndroid Build Coastguard Worker #include "art_method-alloc-inl.h"
23*795d594fSAndroid Build Coastguard Worker #include "base/pointer_size.h"
24*795d594fSAndroid Build Coastguard Worker #include "class_linker-inl.h"
25*795d594fSAndroid Build Coastguard Worker #include "class_root-inl.h"
26*795d594fSAndroid Build Coastguard Worker #include "common_throws.h"
27*795d594fSAndroid Build Coastguard Worker #include "compat_framework.h"
28*795d594fSAndroid Build Coastguard Worker #include "dex/descriptors_names.h"
29*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file-inl.h"
30*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file_annotations.h"
31*795d594fSAndroid Build Coastguard Worker #include "dex/utf.h"
32*795d594fSAndroid Build Coastguard Worker #include "hidden_api.h"
33*795d594fSAndroid Build Coastguard Worker #include "jni/jni_internal.h"
34*795d594fSAndroid Build Coastguard Worker #include "mirror/class-alloc-inl.h"
35*795d594fSAndroid Build Coastguard Worker #include "mirror/class_ext.h"
36*795d594fSAndroid Build Coastguard Worker #include "mirror/class-inl.h"
37*795d594fSAndroid Build Coastguard Worker #include "mirror/class_loader.h"
38*795d594fSAndroid Build Coastguard Worker #include "mirror/field.h"
39*795d594fSAndroid Build Coastguard Worker #include "mirror/method.h"
40*795d594fSAndroid Build Coastguard Worker #include "mirror/method_handles_lookup.h"
41*795d594fSAndroid Build Coastguard Worker #include "mirror/object-inl.h"
42*795d594fSAndroid Build Coastguard Worker #include "mirror/object_array-alloc-inl.h"
43*795d594fSAndroid Build Coastguard Worker #include "mirror/object_array-inl.h"
44*795d594fSAndroid Build Coastguard Worker #include "mirror/proxy.h"
45*795d594fSAndroid Build Coastguard Worker #include "mirror/string-alloc-inl.h"
46*795d594fSAndroid Build Coastguard Worker #include "mirror/string-inl.h"
47*795d594fSAndroid Build Coastguard Worker #include "native_util.h"
48*795d594fSAndroid Build Coastguard Worker #include "nativehelper/jni_macros.h"
49*795d594fSAndroid Build Coastguard Worker #include "nativehelper/scoped_local_ref.h"
50*795d594fSAndroid Build Coastguard Worker #include "nativehelper/scoped_utf_chars.h"
51*795d594fSAndroid Build Coastguard Worker #include "nth_caller_visitor.h"
52*795d594fSAndroid Build Coastguard Worker #include "obj_ptr-inl.h"
53*795d594fSAndroid Build Coastguard Worker #include "reflection.h"
54*795d594fSAndroid Build Coastguard Worker #include "reflective_handle_scope-inl.h"
55*795d594fSAndroid Build Coastguard Worker #include "scoped_fast_native_object_access-inl.h"
56*795d594fSAndroid Build Coastguard Worker #include "scoped_thread_state_change-inl.h"
57*795d594fSAndroid Build Coastguard Worker #include "well_known_classes-inl.h"
58*795d594fSAndroid Build Coastguard Worker
59*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
60*795d594fSAndroid Build Coastguard Worker
GetHiddenapiAccessContextFunction(Thread * self)61*795d594fSAndroid Build Coastguard Worker static std::function<hiddenapi::AccessContext()> GetHiddenapiAccessContextFunction(Thread* self) {
62*795d594fSAndroid Build Coastguard Worker return [=]() REQUIRES_SHARED(Locks::mutator_lock_) {
63*795d594fSAndroid Build Coastguard Worker return hiddenapi::GetReflectionCallerAccessContext(self);
64*795d594fSAndroid Build Coastguard Worker };
65*795d594fSAndroid Build Coastguard Worker }
66*795d594fSAndroid Build Coastguard Worker
67*795d594fSAndroid Build Coastguard Worker // Returns true if the first non-ClassClass caller up the stack should not be
68*795d594fSAndroid Build Coastguard Worker // allowed access to `member`.
69*795d594fSAndroid Build Coastguard Worker template<typename T>
ShouldDenyAccessToMember(T * member,Thread * self)70*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static bool ShouldDenyAccessToMember(T* member, Thread* self)
71*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) {
72*795d594fSAndroid Build Coastguard Worker return hiddenapi::ShouldDenyAccessToMember(member,
73*795d594fSAndroid Build Coastguard Worker GetHiddenapiAccessContextFunction(self),
74*795d594fSAndroid Build Coastguard Worker hiddenapi::AccessMethod::kReflection);
75*795d594fSAndroid Build Coastguard Worker }
76*795d594fSAndroid Build Coastguard Worker
DecodeClass(const ScopedFastNativeObjectAccess & soa,jobject java_class)77*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static inline ObjPtr<mirror::Class> DecodeClass(
78*795d594fSAndroid Build Coastguard Worker const ScopedFastNativeObjectAccess& soa, jobject java_class)
79*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) {
80*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> c = soa.Decode<mirror::Class>(java_class);
81*795d594fSAndroid Build Coastguard Worker DCHECK(c != nullptr);
82*795d594fSAndroid Build Coastguard Worker DCHECK(c->IsClass());
83*795d594fSAndroid Build Coastguard Worker // TODO: we could EnsureInitialized here, rather than on every reflective get/set or invoke .
84*795d594fSAndroid Build Coastguard Worker // For now, we conservatively preserve the old dalvik behavior. A quick "IsInitialized" check
85*795d594fSAndroid Build Coastguard Worker // every time probably doesn't make much difference to reflection performance anyway.
86*795d594fSAndroid Build Coastguard Worker return c;
87*795d594fSAndroid Build Coastguard Worker }
88*795d594fSAndroid Build Coastguard Worker
89*795d594fSAndroid Build Coastguard Worker // "name" is in "binary name" format, e.g. "dalvik.system.Debug$1".
Class_classForName(JNIEnv * env,jclass,jstring javaName,jboolean initialize,jobject javaLoader)90*795d594fSAndroid Build Coastguard Worker static jclass Class_classForName(JNIEnv* env, jclass, jstring javaName, jboolean initialize,
91*795d594fSAndroid Build Coastguard Worker jobject javaLoader) {
92*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
93*795d594fSAndroid Build Coastguard Worker StackHandleScope<3> hs(soa.Self());
94*795d594fSAndroid Build Coastguard Worker Handle<mirror::String> mirror_name = hs.NewHandle(soa.Decode<mirror::String>(javaName));
95*795d594fSAndroid Build Coastguard Worker if (mirror_name == nullptr) {
96*795d594fSAndroid Build Coastguard Worker soa.Self()->ThrowNewWrappedException("Ljava/lang/NullPointerException;", /*msg=*/ nullptr);
97*795d594fSAndroid Build Coastguard Worker return nullptr;
98*795d594fSAndroid Build Coastguard Worker }
99*795d594fSAndroid Build Coastguard Worker
100*795d594fSAndroid Build Coastguard Worker // We need to validate and convert the name (from x.y.z to x/y/z). This
101*795d594fSAndroid Build Coastguard Worker // is especially handy for array types, since we want to avoid
102*795d594fSAndroid Build Coastguard Worker // auto-generating bogus array classes.
103*795d594fSAndroid Build Coastguard Worker std::string name = mirror_name->ToModifiedUtf8();
104*795d594fSAndroid Build Coastguard Worker if (!IsValidBinaryClassName(name.c_str())) {
105*795d594fSAndroid Build Coastguard Worker soa.Self()->ThrowNewExceptionF("Ljava/lang/ClassNotFoundException;",
106*795d594fSAndroid Build Coastguard Worker "Invalid name: %s", name.c_str());
107*795d594fSAndroid Build Coastguard Worker return nullptr;
108*795d594fSAndroid Build Coastguard Worker }
109*795d594fSAndroid Build Coastguard Worker
110*795d594fSAndroid Build Coastguard Worker std::string descriptor(DotToDescriptor(name.c_str()));
111*795d594fSAndroid Build Coastguard Worker Handle<mirror::ClassLoader> class_loader(
112*795d594fSAndroid Build Coastguard Worker hs.NewHandle(soa.Decode<mirror::ClassLoader>(javaLoader)));
113*795d594fSAndroid Build Coastguard Worker ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
114*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> c = hs.NewHandle(
115*795d594fSAndroid Build Coastguard Worker class_linker->FindClass(soa.Self(), descriptor.c_str(), descriptor.length(), class_loader));
116*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(c == nullptr)) {
117*795d594fSAndroid Build Coastguard Worker StackHandleScope<2> hs2(soa.Self());
118*795d594fSAndroid Build Coastguard Worker Handle<mirror::Object> cause = hs2.NewHandle(soa.Self()->GetException());
119*795d594fSAndroid Build Coastguard Worker soa.Self()->ClearException();
120*795d594fSAndroid Build Coastguard Worker Handle<mirror::Object> cnfe =
121*795d594fSAndroid Build Coastguard Worker WellKnownClasses::java_lang_ClassNotFoundException_init->NewObject<'L', 'L'>(
122*795d594fSAndroid Build Coastguard Worker hs2, soa.Self(), mirror_name, cause);
123*795d594fSAndroid Build Coastguard Worker if (cnfe != nullptr) {
124*795d594fSAndroid Build Coastguard Worker // Make sure allocation didn't fail with an OOME.
125*795d594fSAndroid Build Coastguard Worker soa.Self()->SetException(ObjPtr<mirror::Throwable>::DownCast(cnfe.Get()));
126*795d594fSAndroid Build Coastguard Worker }
127*795d594fSAndroid Build Coastguard Worker return nullptr;
128*795d594fSAndroid Build Coastguard Worker }
129*795d594fSAndroid Build Coastguard Worker if (initialize) {
130*795d594fSAndroid Build Coastguard Worker class_linker->EnsureInitialized(soa.Self(), c, true, true);
131*795d594fSAndroid Build Coastguard Worker }
132*795d594fSAndroid Build Coastguard Worker
133*795d594fSAndroid Build Coastguard Worker // java.lang.ClassValue was added in Android U, and proguarding tools
134*795d594fSAndroid Build Coastguard Worker // used that as justification to remove computeValue method implementation.
135*795d594fSAndroid Build Coastguard Worker // Usual pattern was to check that Class.forName("java.lang.ClassValue")
136*795d594fSAndroid Build Coastguard Worker // call does not throw and use ClassValue-based implementation or fallback
137*795d594fSAndroid Build Coastguard Worker // to other solution if it does throw.
138*795d594fSAndroid Build Coastguard Worker // So far ClassValue is the only class with such a problem and hence this
139*795d594fSAndroid Build Coastguard Worker // ad-hoc check.
140*795d594fSAndroid Build Coastguard Worker // See b/259501764.
141*795d594fSAndroid Build Coastguard Worker if (!c->CheckIsVisibleWithTargetSdk(soa.Self())) {
142*795d594fSAndroid Build Coastguard Worker DCHECK(soa.Self()->IsExceptionPending());
143*795d594fSAndroid Build Coastguard Worker return nullptr;
144*795d594fSAndroid Build Coastguard Worker }
145*795d594fSAndroid Build Coastguard Worker
146*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jclass>(c.Get());
147*795d594fSAndroid Build Coastguard Worker }
148*795d594fSAndroid Build Coastguard Worker
Class_getPrimitiveClass(JNIEnv * env,jclass,jstring name)149*795d594fSAndroid Build Coastguard Worker static jclass Class_getPrimitiveClass(JNIEnv* env, jclass, jstring name) {
150*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
151*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> klass = mirror::Class::GetPrimitiveClass(soa.Decode<mirror::String>(name));
152*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jclass>(klass);
153*795d594fSAndroid Build Coastguard Worker }
154*795d594fSAndroid Build Coastguard Worker
Class_getNameNative(JNIEnv * env,jobject javaThis)155*795d594fSAndroid Build Coastguard Worker static jstring Class_getNameNative(JNIEnv* env, jobject javaThis) {
156*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
157*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
158*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> c = DecodeClass(soa, javaThis);
159*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jstring>(mirror::Class::ComputeName(hs.NewHandle(c)));
160*795d594fSAndroid Build Coastguard Worker }
161*795d594fSAndroid Build Coastguard Worker
Class_getInterfacesInternal(JNIEnv * env,jobject javaThis)162*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getInterfacesInternal(JNIEnv* env, jobject javaThis) {
163*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
164*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
165*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
166*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
167*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
168*795d594fSAndroid Build Coastguard Worker return nullptr;
169*795d594fSAndroid Build Coastguard Worker }
170*795d594fSAndroid Build Coastguard Worker
171*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass()) {
172*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs2(soa.Self());
173*795d594fSAndroid Build Coastguard Worker Handle<mirror::ObjectArray<mirror::Class>> interfaces =
174*795d594fSAndroid Build Coastguard Worker hs2.NewHandle(klass->GetProxyInterfaces());
175*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(
176*795d594fSAndroid Build Coastguard Worker mirror::ObjectArray<mirror::Class>::Clone(interfaces, soa.Self()));
177*795d594fSAndroid Build Coastguard Worker }
178*795d594fSAndroid Build Coastguard Worker
179*795d594fSAndroid Build Coastguard Worker const dex::TypeList* iface_list = klass->GetInterfaceTypeList();
180*795d594fSAndroid Build Coastguard Worker if (iface_list == nullptr) {
181*795d594fSAndroid Build Coastguard Worker return nullptr;
182*795d594fSAndroid Build Coastguard Worker }
183*795d594fSAndroid Build Coastguard Worker
184*795d594fSAndroid Build Coastguard Worker ClassLinker* linker = Runtime::Current()->GetClassLinker();
185*795d594fSAndroid Build Coastguard Worker const uint32_t num_ifaces = iface_list->Size();
186*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> class_array_class =
187*795d594fSAndroid Build Coastguard Worker GetClassRoot<mirror::ObjectArray<mirror::Class>>(linker);
188*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ObjectArray<mirror::Class>> ifaces =
189*795d594fSAndroid Build Coastguard Worker mirror::ObjectArray<mirror::Class>::Alloc(soa.Self(), class_array_class, num_ifaces);
190*795d594fSAndroid Build Coastguard Worker if (ifaces.IsNull()) {
191*795d594fSAndroid Build Coastguard Worker DCHECK(soa.Self()->IsExceptionPending());
192*795d594fSAndroid Build Coastguard Worker return nullptr;
193*795d594fSAndroid Build Coastguard Worker }
194*795d594fSAndroid Build Coastguard Worker
195*795d594fSAndroid Build Coastguard Worker // Check that we aren't in an active transaction, we call SetWithoutChecks
196*795d594fSAndroid Build Coastguard Worker // with kActiveTransaction == false.
197*795d594fSAndroid Build Coastguard Worker DCHECK(!Runtime::Current()->IsActiveTransaction());
198*795d594fSAndroid Build Coastguard Worker
199*795d594fSAndroid Build Coastguard Worker for (uint32_t i = 0; i < num_ifaces; ++i) {
200*795d594fSAndroid Build Coastguard Worker const dex::TypeIndex type_idx = iface_list->GetTypeItem(i).type_idx_;
201*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> interface = linker->LookupResolvedType(type_idx, klass.Get());
202*795d594fSAndroid Build Coastguard Worker DCHECK(interface != nullptr);
203*795d594fSAndroid Build Coastguard Worker ifaces->SetWithoutChecks<false>(i, interface);
204*795d594fSAndroid Build Coastguard Worker }
205*795d594fSAndroid Build Coastguard Worker
206*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(ifaces);
207*795d594fSAndroid Build Coastguard Worker }
208*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredFieldsUnchecked(JNIEnv * env,jobject javaThis,jboolean publicOnly)209*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getDeclaredFieldsUnchecked(JNIEnv* env, jobject javaThis,
210*795d594fSAndroid Build Coastguard Worker jboolean publicOnly) {
211*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
212*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
213*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(
214*795d594fSAndroid Build Coastguard Worker klass->GetDeclaredFields(soa.Self(),
215*795d594fSAndroid Build Coastguard Worker publicOnly != JNI_FALSE,
216*795d594fSAndroid Build Coastguard Worker /*force_resolve=*/ false));
217*795d594fSAndroid Build Coastguard Worker }
218*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredFields(JNIEnv * env,jobject javaThis)219*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getDeclaredFields(JNIEnv* env, jobject javaThis) {
220*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
221*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
222*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(
223*795d594fSAndroid Build Coastguard Worker klass->GetDeclaredFields(soa.Self(),
224*795d594fSAndroid Build Coastguard Worker /*public_only=*/ false,
225*795d594fSAndroid Build Coastguard Worker /*force_resolve=*/ true));
226*795d594fSAndroid Build Coastguard Worker }
227*795d594fSAndroid Build Coastguard Worker
Class_getPublicDeclaredFields(JNIEnv * env,jobject javaThis)228*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getPublicDeclaredFields(JNIEnv* env, jobject javaThis) {
229*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
230*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
231*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(
232*795d594fSAndroid Build Coastguard Worker klass->GetDeclaredFields(soa.Self(),
233*795d594fSAndroid Build Coastguard Worker /*public_only=*/ true,
234*795d594fSAndroid Build Coastguard Worker /*force_resolve=*/ true));
235*795d594fSAndroid Build Coastguard Worker }
236*795d594fSAndroid Build Coastguard Worker
237*795d594fSAndroid Build Coastguard Worker // Performs a binary search through an array of fields, TODO: Is this fast enough if we don't use
238*795d594fSAndroid Build Coastguard Worker // the dex cache for lookups? I think CompareModifiedUtf8ToUtf16AsCodePointValues should be fairly
239*795d594fSAndroid Build Coastguard Worker // fast.
FindFieldByName(ObjPtr<mirror::String> name,LengthPrefixedArray<ArtField> * fields)240*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static inline ArtField* FindFieldByName(ObjPtr<mirror::String> name,
241*795d594fSAndroid Build Coastguard Worker LengthPrefixedArray<ArtField>* fields)
242*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) {
243*795d594fSAndroid Build Coastguard Worker if (fields == nullptr) {
244*795d594fSAndroid Build Coastguard Worker return nullptr;
245*795d594fSAndroid Build Coastguard Worker }
246*795d594fSAndroid Build Coastguard Worker size_t low = 0;
247*795d594fSAndroid Build Coastguard Worker size_t high = fields->size();
248*795d594fSAndroid Build Coastguard Worker const bool is_name_compressed = name->IsCompressed();
249*795d594fSAndroid Build Coastguard Worker const uint16_t* const data = (is_name_compressed) ? nullptr : name->GetValue();
250*795d594fSAndroid Build Coastguard Worker const uint8_t* const data_compressed = (is_name_compressed) ? name->GetValueCompressed()
251*795d594fSAndroid Build Coastguard Worker : nullptr;
252*795d594fSAndroid Build Coastguard Worker const size_t length = name->GetLength();
253*795d594fSAndroid Build Coastguard Worker while (low < high) {
254*795d594fSAndroid Build Coastguard Worker auto mid = (low + high) / 2;
255*795d594fSAndroid Build Coastguard Worker ArtField& field = fields->At(mid);
256*795d594fSAndroid Build Coastguard Worker int result = 0;
257*795d594fSAndroid Build Coastguard Worker if (is_name_compressed) {
258*795d594fSAndroid Build Coastguard Worker size_t field_length = strlen(field.GetName());
259*795d594fSAndroid Build Coastguard Worker size_t min_size = (length < field_length) ? length : field_length;
260*795d594fSAndroid Build Coastguard Worker result = memcmp(field.GetName(), data_compressed, min_size);
261*795d594fSAndroid Build Coastguard Worker if (result == 0) {
262*795d594fSAndroid Build Coastguard Worker result = field_length - length;
263*795d594fSAndroid Build Coastguard Worker }
264*795d594fSAndroid Build Coastguard Worker } else {
265*795d594fSAndroid Build Coastguard Worker result = CompareModifiedUtf8ToUtf16AsCodePointValues(field.GetName(), data, length);
266*795d594fSAndroid Build Coastguard Worker }
267*795d594fSAndroid Build Coastguard Worker // Alternate approach, only a few % faster at the cost of more allocations.
268*795d594fSAndroid Build Coastguard Worker // int result = field->GetStringName(self, true)->CompareTo(name);
269*795d594fSAndroid Build Coastguard Worker if (result < 0) {
270*795d594fSAndroid Build Coastguard Worker low = mid + 1;
271*795d594fSAndroid Build Coastguard Worker } else if (result > 0) {
272*795d594fSAndroid Build Coastguard Worker high = mid;
273*795d594fSAndroid Build Coastguard Worker } else {
274*795d594fSAndroid Build Coastguard Worker return &field;
275*795d594fSAndroid Build Coastguard Worker }
276*795d594fSAndroid Build Coastguard Worker }
277*795d594fSAndroid Build Coastguard Worker if (kIsDebugBuild) {
278*795d594fSAndroid Build Coastguard Worker for (ArtField& field : MakeIterationRangeFromLengthPrefixedArray(fields)) {
279*795d594fSAndroid Build Coastguard Worker CHECK_NE(field.GetName(), name->ToModifiedUtf8());
280*795d594fSAndroid Build Coastguard Worker }
281*795d594fSAndroid Build Coastguard Worker }
282*795d594fSAndroid Build Coastguard Worker return nullptr;
283*795d594fSAndroid Build Coastguard Worker }
284*795d594fSAndroid Build Coastguard Worker
GetDeclaredField(Thread * self,ObjPtr<mirror::Class> c,ObjPtr<mirror::String> name)285*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE static inline ObjPtr<mirror::Field> GetDeclaredField(Thread* self,
286*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> c,
287*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::String> name)
288*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) {
289*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(c->IsObsoleteObject())) {
290*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
291*795d594fSAndroid Build Coastguard Worker return nullptr;
292*795d594fSAndroid Build Coastguard Worker }
293*795d594fSAndroid Build Coastguard Worker ArtField* art_field = FindFieldByName(name, c->GetIFieldsPtr());
294*795d594fSAndroid Build Coastguard Worker if (art_field != nullptr) {
295*795d594fSAndroid Build Coastguard Worker return mirror::Field::CreateFromArtField(self, art_field, true);
296*795d594fSAndroid Build Coastguard Worker }
297*795d594fSAndroid Build Coastguard Worker art_field = FindFieldByName(name, c->GetSFieldsPtr());
298*795d594fSAndroid Build Coastguard Worker if (art_field != nullptr) {
299*795d594fSAndroid Build Coastguard Worker return mirror::Field::CreateFromArtField(self, art_field, true);
300*795d594fSAndroid Build Coastguard Worker }
301*795d594fSAndroid Build Coastguard Worker return nullptr;
302*795d594fSAndroid Build Coastguard Worker }
303*795d594fSAndroid Build Coastguard Worker
GetPublicFieldRecursive(Thread * self,ObjPtr<mirror::Class> clazz,ObjPtr<mirror::String> name)304*795d594fSAndroid Build Coastguard Worker static ObjPtr<mirror::Field> GetPublicFieldRecursive(
305*795d594fSAndroid Build Coastguard Worker Thread* self, ObjPtr<mirror::Class> clazz, ObjPtr<mirror::String> name)
306*795d594fSAndroid Build Coastguard Worker REQUIRES_SHARED(Locks::mutator_lock_) {
307*795d594fSAndroid Build Coastguard Worker DCHECK(clazz != nullptr);
308*795d594fSAndroid Build Coastguard Worker DCHECK(name != nullptr);
309*795d594fSAndroid Build Coastguard Worker DCHECK(self != nullptr);
310*795d594fSAndroid Build Coastguard Worker
311*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(clazz->IsObsoleteObject())) {
312*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
313*795d594fSAndroid Build Coastguard Worker return nullptr;
314*795d594fSAndroid Build Coastguard Worker }
315*795d594fSAndroid Build Coastguard Worker StackHandleScope<2> hs(self);
316*795d594fSAndroid Build Coastguard Worker MutableHandle<mirror::Class> h_clazz(hs.NewHandle(clazz));
317*795d594fSAndroid Build Coastguard Worker Handle<mirror::String> h_name(hs.NewHandle(name));
318*795d594fSAndroid Build Coastguard Worker
319*795d594fSAndroid Build Coastguard Worker // We search the current class, its direct interfaces then its superclass.
320*795d594fSAndroid Build Coastguard Worker while (h_clazz != nullptr) {
321*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Field> result = GetDeclaredField(self, h_clazz.Get(), h_name.Get());
322*795d594fSAndroid Build Coastguard Worker if ((result != nullptr) && (result->GetAccessFlags() & kAccPublic)) {
323*795d594fSAndroid Build Coastguard Worker return result;
324*795d594fSAndroid Build Coastguard Worker } else if (UNLIKELY(self->IsExceptionPending())) {
325*795d594fSAndroid Build Coastguard Worker // Something went wrong. Bail out.
326*795d594fSAndroid Build Coastguard Worker return nullptr;
327*795d594fSAndroid Build Coastguard Worker }
328*795d594fSAndroid Build Coastguard Worker
329*795d594fSAndroid Build Coastguard Worker uint32_t num_direct_interfaces = h_clazz->NumDirectInterfaces();
330*795d594fSAndroid Build Coastguard Worker for (uint32_t i = 0; i < num_direct_interfaces; i++) {
331*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> iface = mirror::Class::ResolveDirectInterface(self, h_clazz, i);
332*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(iface == nullptr)) {
333*795d594fSAndroid Build Coastguard Worker self->AssertPendingException();
334*795d594fSAndroid Build Coastguard Worker return nullptr;
335*795d594fSAndroid Build Coastguard Worker }
336*795d594fSAndroid Build Coastguard Worker result = GetPublicFieldRecursive(self, iface, h_name.Get());
337*795d594fSAndroid Build Coastguard Worker if (result != nullptr) {
338*795d594fSAndroid Build Coastguard Worker DCHECK(result->GetAccessFlags() & kAccPublic);
339*795d594fSAndroid Build Coastguard Worker return result;
340*795d594fSAndroid Build Coastguard Worker } else if (UNLIKELY(self->IsExceptionPending())) {
341*795d594fSAndroid Build Coastguard Worker // Something went wrong. Bail out.
342*795d594fSAndroid Build Coastguard Worker return nullptr;
343*795d594fSAndroid Build Coastguard Worker }
344*795d594fSAndroid Build Coastguard Worker }
345*795d594fSAndroid Build Coastguard Worker
346*795d594fSAndroid Build Coastguard Worker // We don't try the superclass if we are an interface.
347*795d594fSAndroid Build Coastguard Worker if (h_clazz->IsInterface()) {
348*795d594fSAndroid Build Coastguard Worker break;
349*795d594fSAndroid Build Coastguard Worker }
350*795d594fSAndroid Build Coastguard Worker
351*795d594fSAndroid Build Coastguard Worker // Get the next class.
352*795d594fSAndroid Build Coastguard Worker h_clazz.Assign(h_clazz->GetSuperClass());
353*795d594fSAndroid Build Coastguard Worker }
354*795d594fSAndroid Build Coastguard Worker return nullptr;
355*795d594fSAndroid Build Coastguard Worker }
356*795d594fSAndroid Build Coastguard Worker
Class_getPublicFieldRecursive(JNIEnv * env,jobject javaThis,jstring name)357*795d594fSAndroid Build Coastguard Worker static jobject Class_getPublicFieldRecursive(JNIEnv* env, jobject javaThis, jstring name) {
358*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
359*795d594fSAndroid Build Coastguard Worker auto name_string = soa.Decode<mirror::String>(name);
360*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(name_string == nullptr)) {
361*795d594fSAndroid Build Coastguard Worker ThrowNullPointerException("name == null");
362*795d594fSAndroid Build Coastguard Worker return nullptr;
363*795d594fSAndroid Build Coastguard Worker }
364*795d594fSAndroid Build Coastguard Worker
365*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
366*795d594fSAndroid Build Coastguard Worker Handle<mirror::Field> field = hs.NewHandle(GetPublicFieldRecursive(
367*795d594fSAndroid Build Coastguard Worker soa.Self(), DecodeClass(soa, javaThis), name_string));
368*795d594fSAndroid Build Coastguard Worker if (field.Get() == nullptr || ShouldDenyAccessToMember(field->GetArtField(), soa.Self())) {
369*795d594fSAndroid Build Coastguard Worker return nullptr;
370*795d594fSAndroid Build Coastguard Worker }
371*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(field.Get());
372*795d594fSAndroid Build Coastguard Worker }
373*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredField(JNIEnv * env,jobject javaThis,jstring name)374*795d594fSAndroid Build Coastguard Worker static jobject Class_getDeclaredField(JNIEnv* env, jobject javaThis, jstring name) {
375*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
376*795d594fSAndroid Build Coastguard Worker StackHandleScope<3> hs(soa.Self());
377*795d594fSAndroid Build Coastguard Worker Handle<mirror::String> h_string = hs.NewHandle(soa.Decode<mirror::String>(name));
378*795d594fSAndroid Build Coastguard Worker if (h_string == nullptr) {
379*795d594fSAndroid Build Coastguard Worker ThrowNullPointerException("name == null");
380*795d594fSAndroid Build Coastguard Worker return nullptr;
381*795d594fSAndroid Build Coastguard Worker }
382*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> h_klass = hs.NewHandle(DecodeClass(soa, javaThis));
383*795d594fSAndroid Build Coastguard Worker Handle<mirror::Field> result =
384*795d594fSAndroid Build Coastguard Worker hs.NewHandle(GetDeclaredField(soa.Self(), h_klass.Get(), h_string.Get()));
385*795d594fSAndroid Build Coastguard Worker if (result == nullptr || ShouldDenyAccessToMember(result->GetArtField(), soa.Self())) {
386*795d594fSAndroid Build Coastguard Worker std::string name_str = h_string->ToModifiedUtf8();
387*795d594fSAndroid Build Coastguard Worker if (name_str == "value" && h_klass->IsStringClass()) {
388*795d594fSAndroid Build Coastguard Worker // We log the error for this specific case, as the user might just swallow the exception.
389*795d594fSAndroid Build Coastguard Worker // This helps diagnose crashes when applications rely on the String#value field being
390*795d594fSAndroid Build Coastguard Worker // there.
391*795d594fSAndroid Build Coastguard Worker // Also print on the error stream to test it through run-test.
392*795d594fSAndroid Build Coastguard Worker std::string message("The String#value field is not present on Android versions >= 6.0");
393*795d594fSAndroid Build Coastguard Worker LOG(ERROR) << message;
394*795d594fSAndroid Build Coastguard Worker std::cerr << message << std::endl;
395*795d594fSAndroid Build Coastguard Worker }
396*795d594fSAndroid Build Coastguard Worker // We may have a pending exception if we failed to resolve.
397*795d594fSAndroid Build Coastguard Worker if (!soa.Self()->IsExceptionPending()) {
398*795d594fSAndroid Build Coastguard Worker ThrowNoSuchFieldException(h_klass.Get(), name_str);
399*795d594fSAndroid Build Coastguard Worker }
400*795d594fSAndroid Build Coastguard Worker return nullptr;
401*795d594fSAndroid Build Coastguard Worker }
402*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(result.Get());
403*795d594fSAndroid Build Coastguard Worker }
404*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredConstructorInternal(JNIEnv * env,jobject javaThis,jobjectArray args)405*795d594fSAndroid Build Coastguard Worker static jobject Class_getDeclaredConstructorInternal(
406*795d594fSAndroid Build Coastguard Worker JNIEnv* env, jobject javaThis, jobjectArray args) {
407*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
408*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
409*795d594fSAndroid Build Coastguard Worker DCHECK(!Runtime::Current()->IsActiveTransaction());
410*795d594fSAndroid Build Coastguard Worker
411*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
412*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
413*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(klass->IsObsoleteObject())) {
414*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
415*795d594fSAndroid Build Coastguard Worker return nullptr;
416*795d594fSAndroid Build Coastguard Worker }
417*795d594fSAndroid Build Coastguard Worker Handle<mirror::Constructor> result = hs.NewHandle(
418*795d594fSAndroid Build Coastguard Worker mirror::Class::GetDeclaredConstructorInternal<kRuntimePointerSize>(
419*795d594fSAndroid Build Coastguard Worker soa.Self(),
420*795d594fSAndroid Build Coastguard Worker klass,
421*795d594fSAndroid Build Coastguard Worker soa.Decode<mirror::ObjectArray<mirror::Class>>(args)));
422*795d594fSAndroid Build Coastguard Worker if (result == nullptr || ShouldDenyAccessToMember(result->GetArtMethod(), soa.Self())) {
423*795d594fSAndroid Build Coastguard Worker return nullptr;
424*795d594fSAndroid Build Coastguard Worker }
425*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(result.Get());
426*795d594fSAndroid Build Coastguard Worker }
427*795d594fSAndroid Build Coastguard Worker
MethodMatchesConstructor(ArtMethod * m,bool public_only,const hiddenapi::AccessContext & hiddenapi_context)428*795d594fSAndroid Build Coastguard Worker static ALWAYS_INLINE inline bool MethodMatchesConstructor(
429*795d594fSAndroid Build Coastguard Worker ArtMethod* m,
430*795d594fSAndroid Build Coastguard Worker bool public_only,
431*795d594fSAndroid Build Coastguard Worker const hiddenapi::AccessContext& hiddenapi_context) REQUIRES_SHARED(Locks::mutator_lock_) {
432*795d594fSAndroid Build Coastguard Worker DCHECK(m != nullptr);
433*795d594fSAndroid Build Coastguard Worker return m->IsConstructor() &&
434*795d594fSAndroid Build Coastguard Worker !m->IsStatic() &&
435*795d594fSAndroid Build Coastguard Worker mirror::Class::IsDiscoverable(public_only, hiddenapi_context, m);
436*795d594fSAndroid Build Coastguard Worker }
437*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredConstructorsInternal(JNIEnv * env,jobject javaThis,jboolean publicOnly)438*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getDeclaredConstructorsInternal(
439*795d594fSAndroid Build Coastguard Worker JNIEnv* env, jobject javaThis, jboolean publicOnly) {
440*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
441*795d594fSAndroid Build Coastguard Worker StackHandleScope<2> hs(soa.Self());
442*795d594fSAndroid Build Coastguard Worker bool public_only = (publicOnly != JNI_FALSE);
443*795d594fSAndroid Build Coastguard Worker auto hiddenapi_context = hiddenapi::GetReflectionCallerAccessContext(soa.Self());
444*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> h_klass = hs.NewHandle(DecodeClass(soa, javaThis));
445*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(h_klass->IsObsoleteObject())) {
446*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
447*795d594fSAndroid Build Coastguard Worker return nullptr;
448*795d594fSAndroid Build Coastguard Worker }
449*795d594fSAndroid Build Coastguard Worker size_t constructor_count = 0;
450*795d594fSAndroid Build Coastguard Worker // Two pass approach for speed.
451*795d594fSAndroid Build Coastguard Worker for (auto& m : h_klass->GetDirectMethods(kRuntimePointerSize)) {
452*795d594fSAndroid Build Coastguard Worker constructor_count += MethodMatchesConstructor(&m, public_only, hiddenapi_context) ? 1u : 0u;
453*795d594fSAndroid Build Coastguard Worker }
454*795d594fSAndroid Build Coastguard Worker auto h_constructors = hs.NewHandle(mirror::ObjectArray<mirror::Constructor>::Alloc(
455*795d594fSAndroid Build Coastguard Worker soa.Self(), GetClassRoot<mirror::ObjectArray<mirror::Constructor>>(), constructor_count));
456*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(h_constructors == nullptr)) {
457*795d594fSAndroid Build Coastguard Worker soa.Self()->AssertPendingException();
458*795d594fSAndroid Build Coastguard Worker return nullptr;
459*795d594fSAndroid Build Coastguard Worker }
460*795d594fSAndroid Build Coastguard Worker constructor_count = 0;
461*795d594fSAndroid Build Coastguard Worker for (auto& m : h_klass->GetDirectMethods(kRuntimePointerSize)) {
462*795d594fSAndroid Build Coastguard Worker if (MethodMatchesConstructor(&m, public_only, hiddenapi_context)) {
463*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
464*795d594fSAndroid Build Coastguard Worker DCHECK(!Runtime::Current()->IsActiveTransaction());
465*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Constructor> constructor =
466*795d594fSAndroid Build Coastguard Worker mirror::Constructor::CreateFromArtMethod<kRuntimePointerSize>(soa.Self(), &m);
467*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(constructor == nullptr)) {
468*795d594fSAndroid Build Coastguard Worker soa.Self()->AssertPendingOOMException();
469*795d594fSAndroid Build Coastguard Worker return nullptr;
470*795d594fSAndroid Build Coastguard Worker }
471*795d594fSAndroid Build Coastguard Worker h_constructors->SetWithoutChecks<false>(constructor_count++, constructor);
472*795d594fSAndroid Build Coastguard Worker }
473*795d594fSAndroid Build Coastguard Worker }
474*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(h_constructors.Get());
475*795d594fSAndroid Build Coastguard Worker }
476*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredMethodInternal(JNIEnv * env,jobject javaThis,jstring name,jobjectArray args)477*795d594fSAndroid Build Coastguard Worker static jobject Class_getDeclaredMethodInternal(JNIEnv* env, jobject javaThis,
478*795d594fSAndroid Build Coastguard Worker jstring name, jobjectArray args) {
479*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
480*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
481*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
482*795d594fSAndroid Build Coastguard Worker DCHECK(!Runtime::Current()->IsActiveTransaction());
483*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> klass = DecodeClass(soa, javaThis);
484*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(klass->IsObsoleteObject())) {
485*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
486*795d594fSAndroid Build Coastguard Worker return nullptr;
487*795d594fSAndroid Build Coastguard Worker }
488*795d594fSAndroid Build Coastguard Worker Handle<mirror::Method> result = hs.NewHandle(
489*795d594fSAndroid Build Coastguard Worker mirror::Class::GetDeclaredMethodInternal<kRuntimePointerSize>(
490*795d594fSAndroid Build Coastguard Worker soa.Self(),
491*795d594fSAndroid Build Coastguard Worker klass,
492*795d594fSAndroid Build Coastguard Worker soa.Decode<mirror::String>(name),
493*795d594fSAndroid Build Coastguard Worker soa.Decode<mirror::ObjectArray<mirror::Class>>(args),
494*795d594fSAndroid Build Coastguard Worker GetHiddenapiAccessContextFunction(soa.Self())));
495*795d594fSAndroid Build Coastguard Worker if (result == nullptr || ShouldDenyAccessToMember(result->GetArtMethod(), soa.Self())) {
496*795d594fSAndroid Build Coastguard Worker return nullptr;
497*795d594fSAndroid Build Coastguard Worker }
498*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(result.Get());
499*795d594fSAndroid Build Coastguard Worker }
500*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredMethodsUnchecked(JNIEnv * env,jobject javaThis,jboolean publicOnly)501*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getDeclaredMethodsUnchecked(JNIEnv* env, jobject javaThis,
502*795d594fSAndroid Build Coastguard Worker jboolean publicOnly) {
503*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
504*795d594fSAndroid Build Coastguard Worker StackHandleScope<2> hs(soa.Self());
505*795d594fSAndroid Build Coastguard Worker
506*795d594fSAndroid Build Coastguard Worker auto hiddenapi_context = hiddenapi::GetReflectionCallerAccessContext(soa.Self());
507*795d594fSAndroid Build Coastguard Worker bool public_only = (publicOnly != JNI_FALSE);
508*795d594fSAndroid Build Coastguard Worker
509*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
510*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
511*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
512*795d594fSAndroid Build Coastguard Worker return nullptr;
513*795d594fSAndroid Build Coastguard Worker }
514*795d594fSAndroid Build Coastguard Worker size_t num_methods = 0;
515*795d594fSAndroid Build Coastguard Worker for (ArtMethod& m : klass->GetDeclaredMethods(kRuntimePointerSize)) {
516*795d594fSAndroid Build Coastguard Worker uint32_t modifiers = m.GetAccessFlags();
517*795d594fSAndroid Build Coastguard Worker // Add non-constructor declared methods.
518*795d594fSAndroid Build Coastguard Worker if ((modifiers & kAccConstructor) == 0 &&
519*795d594fSAndroid Build Coastguard Worker mirror::Class::IsDiscoverable(public_only, hiddenapi_context, &m)) {
520*795d594fSAndroid Build Coastguard Worker ++num_methods;
521*795d594fSAndroid Build Coastguard Worker }
522*795d594fSAndroid Build Coastguard Worker }
523*795d594fSAndroid Build Coastguard Worker auto ret = hs.NewHandle(mirror::ObjectArray<mirror::Method>::Alloc(
524*795d594fSAndroid Build Coastguard Worker soa.Self(), GetClassRoot<mirror::ObjectArray<mirror::Method>>(), num_methods));
525*795d594fSAndroid Build Coastguard Worker if (ret == nullptr) {
526*795d594fSAndroid Build Coastguard Worker soa.Self()->AssertPendingOOMException();
527*795d594fSAndroid Build Coastguard Worker return nullptr;
528*795d594fSAndroid Build Coastguard Worker }
529*795d594fSAndroid Build Coastguard Worker num_methods = 0;
530*795d594fSAndroid Build Coastguard Worker for (ArtMethod& m : klass->GetDeclaredMethods(kRuntimePointerSize)) {
531*795d594fSAndroid Build Coastguard Worker uint32_t modifiers = m.GetAccessFlags();
532*795d594fSAndroid Build Coastguard Worker if ((modifiers & kAccConstructor) == 0 &&
533*795d594fSAndroid Build Coastguard Worker mirror::Class::IsDiscoverable(public_only, hiddenapi_context, &m)) {
534*795d594fSAndroid Build Coastguard Worker DCHECK_EQ(Runtime::Current()->GetClassLinker()->GetImagePointerSize(), kRuntimePointerSize);
535*795d594fSAndroid Build Coastguard Worker DCHECK(!Runtime::Current()->IsActiveTransaction());
536*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Method> method =
537*795d594fSAndroid Build Coastguard Worker mirror::Method::CreateFromArtMethod<kRuntimePointerSize>(soa.Self(), &m);
538*795d594fSAndroid Build Coastguard Worker if (method == nullptr) {
539*795d594fSAndroid Build Coastguard Worker soa.Self()->AssertPendingException();
540*795d594fSAndroid Build Coastguard Worker return nullptr;
541*795d594fSAndroid Build Coastguard Worker }
542*795d594fSAndroid Build Coastguard Worker ret->SetWithoutChecks<false>(num_methods++, method);
543*795d594fSAndroid Build Coastguard Worker }
544*795d594fSAndroid Build Coastguard Worker }
545*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(ret.Get());
546*795d594fSAndroid Build Coastguard Worker }
547*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredAnnotation(JNIEnv * env,jobject javaThis,jclass annotationClass)548*795d594fSAndroid Build Coastguard Worker static jobject Class_getDeclaredAnnotation(JNIEnv* env, jobject javaThis, jclass annotationClass) {
549*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
550*795d594fSAndroid Build Coastguard Worker StackHandleScope<2> hs(soa.Self());
551*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
552*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
553*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
554*795d594fSAndroid Build Coastguard Worker return nullptr;
555*795d594fSAndroid Build Coastguard Worker }
556*795d594fSAndroid Build Coastguard Worker
557*795d594fSAndroid Build Coastguard Worker // Handle public contract to throw NPE if the "annotationClass" argument was null.
558*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(annotationClass == nullptr)) {
559*795d594fSAndroid Build Coastguard Worker ThrowNullPointerException("annotationClass");
560*795d594fSAndroid Build Coastguard Worker return nullptr;
561*795d594fSAndroid Build Coastguard Worker }
562*795d594fSAndroid Build Coastguard Worker
563*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
564*795d594fSAndroid Build Coastguard Worker return nullptr;
565*795d594fSAndroid Build Coastguard Worker }
566*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> annotation_class(hs.NewHandle(soa.Decode<mirror::Class>(annotationClass)));
567*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(
568*795d594fSAndroid Build Coastguard Worker annotations::GetAnnotationForClass(klass, annotation_class));
569*795d594fSAndroid Build Coastguard Worker }
570*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredAnnotations(JNIEnv * env,jobject javaThis)571*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getDeclaredAnnotations(JNIEnv* env, jobject javaThis) {
572*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
573*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
574*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
575*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
576*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
577*795d594fSAndroid Build Coastguard Worker return nullptr;
578*795d594fSAndroid Build Coastguard Worker }
579*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
580*795d594fSAndroid Build Coastguard Worker // Return an empty array instead of a null pointer.
581*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> annotation_array_class =
582*795d594fSAndroid Build Coastguard Worker WellKnownClasses::ToClass(WellKnownClasses::java_lang_annotation_Annotation__array);
583*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ObjectArray<mirror::Object>> empty_array =
584*795d594fSAndroid Build Coastguard Worker mirror::ObjectArray<mirror::Object>::Alloc(soa.Self(),
585*795d594fSAndroid Build Coastguard Worker annotation_array_class,
586*795d594fSAndroid Build Coastguard Worker /* length= */ 0);
587*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(empty_array);
588*795d594fSAndroid Build Coastguard Worker }
589*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(annotations::GetAnnotationsForClass(klass));
590*795d594fSAndroid Build Coastguard Worker }
591*795d594fSAndroid Build Coastguard Worker
Class_getDeclaredClasses(JNIEnv * env,jobject javaThis)592*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getDeclaredClasses(JNIEnv* env, jobject javaThis) {
593*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
594*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
595*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
596*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
597*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
598*795d594fSAndroid Build Coastguard Worker return nullptr;
599*795d594fSAndroid Build Coastguard Worker }
600*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ObjectArray<mirror::Class>> classes = nullptr;
601*795d594fSAndroid Build Coastguard Worker if (!klass->IsProxyClass() && klass->GetDexCache() != nullptr) {
602*795d594fSAndroid Build Coastguard Worker classes = annotations::GetDeclaredClasses(klass);
603*795d594fSAndroid Build Coastguard Worker }
604*795d594fSAndroid Build Coastguard Worker if (classes == nullptr) {
605*795d594fSAndroid Build Coastguard Worker // Return an empty array instead of a null pointer.
606*795d594fSAndroid Build Coastguard Worker if (soa.Self()->IsExceptionPending()) {
607*795d594fSAndroid Build Coastguard Worker // Pending exception from GetDeclaredClasses.
608*795d594fSAndroid Build Coastguard Worker return nullptr;
609*795d594fSAndroid Build Coastguard Worker }
610*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> class_array_class = GetClassRoot<mirror::ObjectArray<mirror::Class>>();
611*795d594fSAndroid Build Coastguard Worker DCHECK(class_array_class != nullptr);
612*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ObjectArray<mirror::Class>> empty_array =
613*795d594fSAndroid Build Coastguard Worker mirror::ObjectArray<mirror::Class>::Alloc(soa.Self(), class_array_class, 0);
614*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(empty_array);
615*795d594fSAndroid Build Coastguard Worker }
616*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(classes);
617*795d594fSAndroid Build Coastguard Worker }
618*795d594fSAndroid Build Coastguard Worker
Class_getEnclosingClass(JNIEnv * env,jobject javaThis)619*795d594fSAndroid Build Coastguard Worker static jclass Class_getEnclosingClass(JNIEnv* env, jobject javaThis) {
620*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
621*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
622*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
623*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
624*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
625*795d594fSAndroid Build Coastguard Worker return nullptr;
626*795d594fSAndroid Build Coastguard Worker }
627*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
628*795d594fSAndroid Build Coastguard Worker return nullptr;
629*795d594fSAndroid Build Coastguard Worker }
630*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jclass>(annotations::GetEnclosingClass(klass));
631*795d594fSAndroid Build Coastguard Worker }
632*795d594fSAndroid Build Coastguard Worker
Class_getEnclosingConstructorNative(JNIEnv * env,jobject javaThis)633*795d594fSAndroid Build Coastguard Worker static jobject Class_getEnclosingConstructorNative(JNIEnv* env, jobject javaThis) {
634*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
635*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
636*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
637*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
638*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
639*795d594fSAndroid Build Coastguard Worker return nullptr;
640*795d594fSAndroid Build Coastguard Worker }
641*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
642*795d594fSAndroid Build Coastguard Worker return nullptr;
643*795d594fSAndroid Build Coastguard Worker }
644*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> method = annotations::GetEnclosingMethod(klass);
645*795d594fSAndroid Build Coastguard Worker if (method != nullptr) {
646*795d594fSAndroid Build Coastguard Worker if (GetClassRoot<mirror::Constructor>() == method->GetClass()) {
647*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(method);
648*795d594fSAndroid Build Coastguard Worker }
649*795d594fSAndroid Build Coastguard Worker }
650*795d594fSAndroid Build Coastguard Worker return nullptr;
651*795d594fSAndroid Build Coastguard Worker }
652*795d594fSAndroid Build Coastguard Worker
Class_getEnclosingMethodNative(JNIEnv * env,jobject javaThis)653*795d594fSAndroid Build Coastguard Worker static jobject Class_getEnclosingMethodNative(JNIEnv* env, jobject javaThis) {
654*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
655*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
656*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
657*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
658*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
659*795d594fSAndroid Build Coastguard Worker return nullptr;
660*795d594fSAndroid Build Coastguard Worker }
661*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
662*795d594fSAndroid Build Coastguard Worker return nullptr;
663*795d594fSAndroid Build Coastguard Worker }
664*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> method = annotations::GetEnclosingMethod(klass);
665*795d594fSAndroid Build Coastguard Worker if (method != nullptr) {
666*795d594fSAndroid Build Coastguard Worker if (GetClassRoot<mirror::Method>() == method->GetClass()) {
667*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(method);
668*795d594fSAndroid Build Coastguard Worker }
669*795d594fSAndroid Build Coastguard Worker }
670*795d594fSAndroid Build Coastguard Worker return nullptr;
671*795d594fSAndroid Build Coastguard Worker }
672*795d594fSAndroid Build Coastguard Worker
Class_getInnerClassFlags(JNIEnv * env,jobject javaThis,jint defaultValue)673*795d594fSAndroid Build Coastguard Worker static jint Class_getInnerClassFlags(JNIEnv* env, jobject javaThis, jint defaultValue) {
674*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
675*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
676*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
677*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
678*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
679*795d594fSAndroid Build Coastguard Worker return 0;
680*795d594fSAndroid Build Coastguard Worker }
681*795d594fSAndroid Build Coastguard Worker return mirror::Class::GetInnerClassFlags(klass, defaultValue);
682*795d594fSAndroid Build Coastguard Worker }
683*795d594fSAndroid Build Coastguard Worker
Class_getSimpleNameNative(JNIEnv * env,jobject javaThis)684*795d594fSAndroid Build Coastguard Worker static jstring Class_getSimpleNameNative(JNIEnv* env, jobject javaThis) {
685*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
686*795d594fSAndroid Build Coastguard Worker StackHandleScope<3> hs(soa.Self());
687*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
688*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
689*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
690*795d594fSAndroid Build Coastguard Worker return nullptr;
691*795d594fSAndroid Build Coastguard Worker }
692*795d594fSAndroid Build Coastguard Worker if (!klass->IsProxyClass() && klass->GetDexCache() != nullptr) {
693*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::String> class_name = nullptr;
694*795d594fSAndroid Build Coastguard Worker if (annotations::GetInnerClass(klass, &class_name)) {
695*795d594fSAndroid Build Coastguard Worker if (class_name == nullptr) { // Anonymous class
696*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> j_l_String =
697*795d594fSAndroid Build Coastguard Worker WellKnownClasses::java_lang_String_EMPTY->GetDeclaringClass();
698*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> empty_string =
699*795d594fSAndroid Build Coastguard Worker WellKnownClasses::java_lang_String_EMPTY->GetObject(j_l_String);
700*795d594fSAndroid Build Coastguard Worker DCHECK(empty_string != nullptr);
701*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jstring>(empty_string);
702*795d594fSAndroid Build Coastguard Worker }
703*795d594fSAndroid Build Coastguard Worker Handle<mirror::String> h_inner_name(hs.NewHandle<mirror::String>(class_name));
704*795d594fSAndroid Build Coastguard Worker if (annotations::GetDeclaringClass(klass) != nullptr || // member class
705*795d594fSAndroid Build Coastguard Worker annotations::GetEnclosingMethod(klass) != nullptr) { // local class
706*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jstring>(h_inner_name.Get());
707*795d594fSAndroid Build Coastguard Worker }
708*795d594fSAndroid Build Coastguard Worker }
709*795d594fSAndroid Build Coastguard Worker }
710*795d594fSAndroid Build Coastguard Worker
711*795d594fSAndroid Build Coastguard Worker Handle<mirror::String> h_name(hs.NewHandle<mirror::String>(mirror::Class::ComputeName(klass)));
712*795d594fSAndroid Build Coastguard Worker if (h_name == nullptr) {
713*795d594fSAndroid Build Coastguard Worker return nullptr;
714*795d594fSAndroid Build Coastguard Worker }
715*795d594fSAndroid Build Coastguard Worker int32_t dot_index = h_name->LastIndexOf('.');
716*795d594fSAndroid Build Coastguard Worker if (dot_index < 0) {
717*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jstring>(h_name.Get());
718*795d594fSAndroid Build Coastguard Worker }
719*795d594fSAndroid Build Coastguard Worker int32_t start_index = dot_index + 1;
720*795d594fSAndroid Build Coastguard Worker int32_t length = h_name->GetLength() - start_index;
721*795d594fSAndroid Build Coastguard Worker gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator();
722*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jstring>(
723*795d594fSAndroid Build Coastguard Worker mirror::String::AllocFromString(soa.Self(), length, h_name, start_index, allocator_type));
724*795d594fSAndroid Build Coastguard Worker }
725*795d594fSAndroid Build Coastguard Worker
Class_getSignatureAnnotation(JNIEnv * env,jobject javaThis)726*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getSignatureAnnotation(JNIEnv* env, jobject javaThis) {
727*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
728*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
729*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
730*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
731*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
732*795d594fSAndroid Build Coastguard Worker return nullptr;
733*795d594fSAndroid Build Coastguard Worker }
734*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
735*795d594fSAndroid Build Coastguard Worker return nullptr;
736*795d594fSAndroid Build Coastguard Worker }
737*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(
738*795d594fSAndroid Build Coastguard Worker annotations::GetSignatureAnnotationForClass(klass));
739*795d594fSAndroid Build Coastguard Worker }
740*795d594fSAndroid Build Coastguard Worker
Class_isAnonymousClass(JNIEnv * env,jobject javaThis)741*795d594fSAndroid Build Coastguard Worker static jboolean Class_isAnonymousClass(JNIEnv* env, jobject javaThis) {
742*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
743*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
744*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
745*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
746*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
747*795d594fSAndroid Build Coastguard Worker return 0;
748*795d594fSAndroid Build Coastguard Worker }
749*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
750*795d594fSAndroid Build Coastguard Worker return false;
751*795d594fSAndroid Build Coastguard Worker }
752*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::String> class_name = nullptr;
753*795d594fSAndroid Build Coastguard Worker if (!annotations::GetInnerClass(klass, &class_name)) {
754*795d594fSAndroid Build Coastguard Worker return false;
755*795d594fSAndroid Build Coastguard Worker }
756*795d594fSAndroid Build Coastguard Worker return class_name == nullptr;
757*795d594fSAndroid Build Coastguard Worker }
758*795d594fSAndroid Build Coastguard Worker
Class_isRecord0(JNIEnv * env,jobject javaThis)759*795d594fSAndroid Build Coastguard Worker static jboolean Class_isRecord0(JNIEnv* env, jobject javaThis) {
760*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
761*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
762*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
763*795d594fSAndroid Build Coastguard Worker return klass->IsRecordClass();
764*795d594fSAndroid Build Coastguard Worker }
765*795d594fSAndroid Build Coastguard Worker
Class_isDeclaredAnnotationPresent(JNIEnv * env,jobject javaThis,jclass annotationType)766*795d594fSAndroid Build Coastguard Worker static jboolean Class_isDeclaredAnnotationPresent(JNIEnv* env, jobject javaThis,
767*795d594fSAndroid Build Coastguard Worker jclass annotationType) {
768*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
769*795d594fSAndroid Build Coastguard Worker StackHandleScope<2> hs(soa.Self());
770*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
771*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
772*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
773*795d594fSAndroid Build Coastguard Worker return false;
774*795d594fSAndroid Build Coastguard Worker }
775*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
776*795d594fSAndroid Build Coastguard Worker return false;
777*795d594fSAndroid Build Coastguard Worker }
778*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> annotation_class(hs.NewHandle(soa.Decode<mirror::Class>(annotationType)));
779*795d594fSAndroid Build Coastguard Worker return annotations::IsClassAnnotationPresent(klass, annotation_class);
780*795d594fSAndroid Build Coastguard Worker }
781*795d594fSAndroid Build Coastguard Worker
Class_getDeclaringClass(JNIEnv * env,jobject javaThis)782*795d594fSAndroid Build Coastguard Worker static jclass Class_getDeclaringClass(JNIEnv* env, jobject javaThis) {
783*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
784*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
785*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
786*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
787*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
788*795d594fSAndroid Build Coastguard Worker return nullptr;
789*795d594fSAndroid Build Coastguard Worker }
790*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
791*795d594fSAndroid Build Coastguard Worker return nullptr;
792*795d594fSAndroid Build Coastguard Worker }
793*795d594fSAndroid Build Coastguard Worker // Return null for anonymous classes.
794*795d594fSAndroid Build Coastguard Worker if (Class_isAnonymousClass(env, javaThis)) {
795*795d594fSAndroid Build Coastguard Worker return nullptr;
796*795d594fSAndroid Build Coastguard Worker }
797*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jclass>(annotations::GetDeclaringClass(klass));
798*795d594fSAndroid Build Coastguard Worker }
799*795d594fSAndroid Build Coastguard Worker
Class_getNestHostFromAnnotation(JNIEnv * env,jobject javaThis)800*795d594fSAndroid Build Coastguard Worker static jclass Class_getNestHostFromAnnotation(JNIEnv* env, jobject javaThis) {
801*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
802*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
803*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
804*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
805*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
806*795d594fSAndroid Build Coastguard Worker return nullptr;
807*795d594fSAndroid Build Coastguard Worker }
808*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
809*795d594fSAndroid Build Coastguard Worker return nullptr;
810*795d594fSAndroid Build Coastguard Worker }
811*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> hostClass = annotations::GetNestHost(klass);
812*795d594fSAndroid Build Coastguard Worker if (hostClass == nullptr) {
813*795d594fSAndroid Build Coastguard Worker return nullptr;
814*795d594fSAndroid Build Coastguard Worker }
815*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jclass>(hostClass);
816*795d594fSAndroid Build Coastguard Worker }
817*795d594fSAndroid Build Coastguard Worker
Class_getNestMembersFromAnnotation(JNIEnv * env,jobject javaThis)818*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getNestMembersFromAnnotation(JNIEnv* env, jobject javaThis) {
819*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
820*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
821*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
822*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
823*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
824*795d594fSAndroid Build Coastguard Worker return nullptr;
825*795d594fSAndroid Build Coastguard Worker }
826*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
827*795d594fSAndroid Build Coastguard Worker return nullptr;
828*795d594fSAndroid Build Coastguard Worker }
829*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ObjectArray<mirror::Class>> classes = annotations::GetNestMembers(klass);
830*795d594fSAndroid Build Coastguard Worker if (classes == nullptr) {
831*795d594fSAndroid Build Coastguard Worker return nullptr;
832*795d594fSAndroid Build Coastguard Worker }
833*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(classes);
834*795d594fSAndroid Build Coastguard Worker }
835*795d594fSAndroid Build Coastguard Worker
Class_getRecordAnnotationElement(JNIEnv * env,jobject javaThis,jstring element_name,jclass array_class)836*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getRecordAnnotationElement(JNIEnv* env,
837*795d594fSAndroid Build Coastguard Worker jobject javaThis,
838*795d594fSAndroid Build Coastguard Worker jstring element_name,
839*795d594fSAndroid Build Coastguard Worker jclass array_class) {
840*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
841*795d594fSAndroid Build Coastguard Worker ScopedUtfChars name(env, element_name);
842*795d594fSAndroid Build Coastguard Worker StackHandleScope<2> hs(soa.Self());
843*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
844*795d594fSAndroid Build Coastguard Worker if (!(klass->IsRecordClass())) {
845*795d594fSAndroid Build Coastguard Worker return nullptr;
846*795d594fSAndroid Build Coastguard Worker }
847*795d594fSAndroid Build Coastguard Worker
848*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> a_class(hs.NewHandle(DecodeClass(soa, array_class)));
849*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> element_array =
850*795d594fSAndroid Build Coastguard Worker annotations::getRecordAnnotationElement(klass, a_class, name.c_str());
851*795d594fSAndroid Build Coastguard Worker if (element_array == nullptr || !(element_array->IsObjectArray())) {
852*795d594fSAndroid Build Coastguard Worker return nullptr;
853*795d594fSAndroid Build Coastguard Worker }
854*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(element_array);
855*795d594fSAndroid Build Coastguard Worker }
856*795d594fSAndroid Build Coastguard Worker
Class_getPermittedSubclassesFromAnnotation(JNIEnv * env,jobject javaThis)857*795d594fSAndroid Build Coastguard Worker static jobjectArray Class_getPermittedSubclassesFromAnnotation(JNIEnv* env, jobject javaThis) {
858*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
859*795d594fSAndroid Build Coastguard Worker StackHandleScope<1> hs(soa.Self());
860*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass(hs.NewHandle(DecodeClass(soa, javaThis)));
861*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
862*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
863*795d594fSAndroid Build Coastguard Worker return nullptr;
864*795d594fSAndroid Build Coastguard Worker }
865*795d594fSAndroid Build Coastguard Worker if (klass->IsProxyClass() || klass->GetDexCache() == nullptr) {
866*795d594fSAndroid Build Coastguard Worker return nullptr;
867*795d594fSAndroid Build Coastguard Worker }
868*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::ObjectArray<mirror::Class>> classes = annotations::GetPermittedSubclasses(klass);
869*795d594fSAndroid Build Coastguard Worker if (classes == nullptr) {
870*795d594fSAndroid Build Coastguard Worker return nullptr;
871*795d594fSAndroid Build Coastguard Worker }
872*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobjectArray>(classes);
873*795d594fSAndroid Build Coastguard Worker }
874*795d594fSAndroid Build Coastguard Worker
Class_ensureExtDataPresent(JNIEnv * env,jobject javaThis)875*795d594fSAndroid Build Coastguard Worker static jobject Class_ensureExtDataPresent(JNIEnv* env, jobject javaThis) {
876*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
877*795d594fSAndroid Build Coastguard Worker StackHandleScope<2> hs(soa.Self());
878*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
879*795d594fSAndroid Build Coastguard Worker
880*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> extDataPtr =
881*795d594fSAndroid Build Coastguard Worker mirror::Class::EnsureExtDataPresent(klass, Thread::Current());
882*795d594fSAndroid Build Coastguard Worker
883*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(extDataPtr);
884*795d594fSAndroid Build Coastguard Worker }
885*795d594fSAndroid Build Coastguard Worker
Class_newInstance(JNIEnv * env,jobject javaThis)886*795d594fSAndroid Build Coastguard Worker static jobject Class_newInstance(JNIEnv* env, jobject javaThis) {
887*795d594fSAndroid Build Coastguard Worker ScopedFastNativeObjectAccess soa(env);
888*795d594fSAndroid Build Coastguard Worker StackHandleScope<4> hs(soa.Self());
889*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> klass = hs.NewHandle(DecodeClass(soa, javaThis));
890*795d594fSAndroid Build Coastguard Worker if (klass->IsObsoleteObject()) {
891*795d594fSAndroid Build Coastguard Worker ThrowRuntimeException("Obsolete Object!");
892*795d594fSAndroid Build Coastguard Worker return nullptr;
893*795d594fSAndroid Build Coastguard Worker }
894*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(klass->GetPrimitiveType() != 0 || klass->IsInterface() || klass->IsArrayClass() ||
895*795d594fSAndroid Build Coastguard Worker klass->IsAbstract())) {
896*795d594fSAndroid Build Coastguard Worker soa.Self()->ThrowNewExceptionF("Ljava/lang/InstantiationException;",
897*795d594fSAndroid Build Coastguard Worker "%s cannot be instantiated",
898*795d594fSAndroid Build Coastguard Worker klass->PrettyClass().c_str());
899*795d594fSAndroid Build Coastguard Worker return nullptr;
900*795d594fSAndroid Build Coastguard Worker }
901*795d594fSAndroid Build Coastguard Worker auto caller = hs.NewHandle<mirror::Class>(nullptr);
902*795d594fSAndroid Build Coastguard Worker // Verify that we can access the class.
903*795d594fSAndroid Build Coastguard Worker if (!klass->IsPublic()) {
904*795d594fSAndroid Build Coastguard Worker caller.Assign(GetCallingClass(soa.Self(), 1));
905*795d594fSAndroid Build Coastguard Worker if (caller != nullptr && !caller->CanAccess(klass.Get())) {
906*795d594fSAndroid Build Coastguard Worker soa.Self()->ThrowNewExceptionF(
907*795d594fSAndroid Build Coastguard Worker "Ljava/lang/IllegalAccessException;", "%s is not accessible from %s",
908*795d594fSAndroid Build Coastguard Worker klass->PrettyClass().c_str(), caller->PrettyClass().c_str());
909*795d594fSAndroid Build Coastguard Worker return nullptr;
910*795d594fSAndroid Build Coastguard Worker }
911*795d594fSAndroid Build Coastguard Worker }
912*795d594fSAndroid Build Coastguard Worker StackArtMethodHandleScope<1> mhs(soa.Self());
913*795d594fSAndroid Build Coastguard Worker ReflectiveHandle<ArtMethod> constructor(mhs.NewMethodHandle(klass->GetDeclaredConstructor(
914*795d594fSAndroid Build Coastguard Worker soa.Self(), ScopedNullHandle<mirror::ObjectArray<mirror::Class>>(), kRuntimePointerSize)));
915*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(constructor == nullptr) || ShouldDenyAccessToMember(constructor.Get(), soa.Self())) {
916*795d594fSAndroid Build Coastguard Worker soa.Self()->ThrowNewExceptionF("Ljava/lang/InstantiationException;",
917*795d594fSAndroid Build Coastguard Worker "%s has no zero argument constructor",
918*795d594fSAndroid Build Coastguard Worker klass->PrettyClass().c_str());
919*795d594fSAndroid Build Coastguard Worker return nullptr;
920*795d594fSAndroid Build Coastguard Worker }
921*795d594fSAndroid Build Coastguard Worker // Invoke the string allocator to return an empty string for the string class.
922*795d594fSAndroid Build Coastguard Worker if (klass->IsStringClass()) {
923*795d594fSAndroid Build Coastguard Worker gc::AllocatorType allocator_type = Runtime::Current()->GetHeap()->GetCurrentAllocator();
924*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Object> obj = mirror::String::AllocEmptyString(soa.Self(), allocator_type);
925*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(soa.Self()->IsExceptionPending())) {
926*795d594fSAndroid Build Coastguard Worker return nullptr;
927*795d594fSAndroid Build Coastguard Worker } else {
928*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(obj);
929*795d594fSAndroid Build Coastguard Worker }
930*795d594fSAndroid Build Coastguard Worker }
931*795d594fSAndroid Build Coastguard Worker auto receiver = hs.NewHandle(klass->AllocObject(soa.Self()));
932*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(receiver == nullptr)) {
933*795d594fSAndroid Build Coastguard Worker soa.Self()->AssertPendingOOMException();
934*795d594fSAndroid Build Coastguard Worker return nullptr;
935*795d594fSAndroid Build Coastguard Worker }
936*795d594fSAndroid Build Coastguard Worker // Verify that we can access the constructor.
937*795d594fSAndroid Build Coastguard Worker ObjPtr<mirror::Class> declaring_class = constructor->GetDeclaringClass();
938*795d594fSAndroid Build Coastguard Worker if (!constructor->IsPublic()) {
939*795d594fSAndroid Build Coastguard Worker if (caller == nullptr) {
940*795d594fSAndroid Build Coastguard Worker caller.Assign(GetCallingClass(soa.Self(), 1));
941*795d594fSAndroid Build Coastguard Worker }
942*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(caller != nullptr && !VerifyAccess(receiver.Get(),
943*795d594fSAndroid Build Coastguard Worker declaring_class,
944*795d594fSAndroid Build Coastguard Worker constructor->GetAccessFlags(),
945*795d594fSAndroid Build Coastguard Worker caller.Get()))) {
946*795d594fSAndroid Build Coastguard Worker soa.Self()->ThrowNewExceptionF(
947*795d594fSAndroid Build Coastguard Worker "Ljava/lang/IllegalAccessException;", "%s is not accessible from %s",
948*795d594fSAndroid Build Coastguard Worker constructor->PrettyMethod().c_str(), caller->PrettyClass().c_str());
949*795d594fSAndroid Build Coastguard Worker return nullptr;
950*795d594fSAndroid Build Coastguard Worker }
951*795d594fSAndroid Build Coastguard Worker }
952*795d594fSAndroid Build Coastguard Worker // Ensure that we are initialized.
953*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(!declaring_class->IsVisiblyInitialized())) {
954*795d594fSAndroid Build Coastguard Worker Thread* self = soa.Self();
955*795d594fSAndroid Build Coastguard Worker Handle<mirror::Class> h_class = hs.NewHandle(declaring_class);
956*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(!Runtime::Current()->GetClassLinker()->EnsureInitialized(
957*795d594fSAndroid Build Coastguard Worker self, h_class, /*can_init_fields=*/ true, /*can_init_parents=*/ true))) {
958*795d594fSAndroid Build Coastguard Worker DCHECK(self->IsExceptionPending());
959*795d594fSAndroid Build Coastguard Worker return nullptr;
960*795d594fSAndroid Build Coastguard Worker }
961*795d594fSAndroid Build Coastguard Worker DCHECK(h_class->IsInitializing());
962*795d594fSAndroid Build Coastguard Worker }
963*795d594fSAndroid Build Coastguard Worker // Invoke the constructor.
964*795d594fSAndroid Build Coastguard Worker JValue result;
965*795d594fSAndroid Build Coastguard Worker uint32_t args[1] = { static_cast<uint32_t>(reinterpret_cast<uintptr_t>(receiver.Get())) };
966*795d594fSAndroid Build Coastguard Worker constructor->Invoke(soa.Self(), args, sizeof(args), &result, "V");
967*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(soa.Self()->IsExceptionPending())) {
968*795d594fSAndroid Build Coastguard Worker return nullptr;
969*795d594fSAndroid Build Coastguard Worker }
970*795d594fSAndroid Build Coastguard Worker // Constructors are ()V methods, so we shouldn't touch the result of InvokeMethod.
971*795d594fSAndroid Build Coastguard Worker return soa.AddLocalReference<jobject>(receiver.Get());
972*795d594fSAndroid Build Coastguard Worker }
973*795d594fSAndroid Build Coastguard Worker
974*795d594fSAndroid Build Coastguard Worker static JNINativeMethod gMethods[] = {
975*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, classForName,
976*795d594fSAndroid Build Coastguard Worker "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;"),
977*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, ensureExtDataPresent, "()Ldalvik/system/ClassExt;"),
978*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredAnnotation,
979*795d594fSAndroid Build Coastguard Worker "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;"),
980*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredAnnotations, "()[Ljava/lang/annotation/Annotation;"),
981*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredClasses, "()[Ljava/lang/Class;"),
982*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredConstructorInternal,
983*795d594fSAndroid Build Coastguard Worker "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"),
984*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredConstructorsInternal, "(Z)[Ljava/lang/reflect/Constructor;"),
985*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredField, "(Ljava/lang/String;)Ljava/lang/reflect/Field;"),
986*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getPublicFieldRecursive, "(Ljava/lang/String;)Ljava/lang/reflect/Field;"),
987*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredFields, "()[Ljava/lang/reflect/Field;"),
988*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredFieldsUnchecked, "(Z)[Ljava/lang/reflect/Field;"),
989*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredMethodInternal,
990*795d594fSAndroid Build Coastguard Worker "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"),
991*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaredMethodsUnchecked,
992*795d594fSAndroid Build Coastguard Worker "(Z)[Ljava/lang/reflect/Method;"),
993*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getDeclaringClass, "()Ljava/lang/Class;"),
994*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getEnclosingClass, "()Ljava/lang/Class;"),
995*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getEnclosingConstructorNative, "()Ljava/lang/reflect/Constructor;"),
996*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getEnclosingMethodNative, "()Ljava/lang/reflect/Method;"),
997*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getInnerClassFlags, "(I)I"),
998*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getInterfacesInternal, "()[Ljava/lang/Class;"),
999*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getPrimitiveClass, "(Ljava/lang/String;)Ljava/lang/Class;"),
1000*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getNameNative, "()Ljava/lang/String;"),
1001*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getNestHostFromAnnotation, "()Ljava/lang/Class;"),
1002*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getNestMembersFromAnnotation, "()[Ljava/lang/Class;"),
1003*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getPermittedSubclassesFromAnnotation, "()[Ljava/lang/Class;"),
1004*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getPublicDeclaredFields, "()[Ljava/lang/reflect/Field;"),
1005*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getRecordAnnotationElement, "(Ljava/lang/String;Ljava/lang/Class;)[Ljava/lang/Object;"),
1006*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getSignatureAnnotation, "()[Ljava/lang/String;"),
1007*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, getSimpleNameNative, "()Ljava/lang/String;"),
1008*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, isAnonymousClass, "()Z"),
1009*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, isDeclaredAnnotationPresent, "(Ljava/lang/Class;)Z"),
1010*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, isRecord0, "()Z"),
1011*795d594fSAndroid Build Coastguard Worker FAST_NATIVE_METHOD(Class, newInstance, "()Ljava/lang/Object;"),
1012*795d594fSAndroid Build Coastguard Worker };
1013*795d594fSAndroid Build Coastguard Worker
register_java_lang_Class(JNIEnv * env)1014*795d594fSAndroid Build Coastguard Worker void register_java_lang_Class(JNIEnv* env) {
1015*795d594fSAndroid Build Coastguard Worker REGISTER_NATIVE_METHODS("java/lang/Class");
1016*795d594fSAndroid Build Coastguard Worker }
1017*795d594fSAndroid Build Coastguard Worker
1018*795d594fSAndroid Build Coastguard Worker } // namespace art
1019