15b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom/* 25b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * Copyright (C) 2008 The Android Open Source Project 35b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * 45b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 55b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * you may not use this file except in compliance with the License. 65b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * You may obtain a copy of the License at 75b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * 85b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 95b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * 105b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 115b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 125b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * See the License for the specific language governing permissions and 145b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom * limitations under the License. 155b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom */ 165b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 17277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#include "java_lang_reflect_Array.h" 18277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe 199837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers#include "class_linker-inl.h" 2062d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers#include "common_throws.h" 214f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "dex_file-inl.h" 22eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes#include "jni_internal.h" 234f6ad8ab428038129b2d0d6c40b7fd625cca15e1Ian Rogers#include "mirror/class-inl.h" 242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h" 251eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers#include "scoped_fast_native_object_access.h" 26eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier#include "handle_scope-inl.h" 275b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 285b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstromnamespace art { 295b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 302cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartierstatic jobject Array_createMultiArray( 312cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier JNIEnv* env, jclass, jclass javaElementClass, jobject javaDimArray) { 321eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers ScopedFastNativeObjectAccess soa(env); 332cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier DCHECK(javaElementClass != nullptr); 34eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier StackHandleScope<2> hs(soa.Self()); 35eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier Handle<mirror::Class> element_class(hs.NewHandle(soa.Decode<mirror::Class*>(javaElementClass))); 365b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom DCHECK(element_class->IsClass()); 372cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier DCHECK(javaDimArray != nullptr); 382dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* dimensions_obj = soa.Decode<mirror::Object*>(javaDimArray); 395b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom DCHECK(dimensions_obj->IsArrayInstance()); 401ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers DCHECK_EQ(dimensions_obj->GetClass()->GetComponentType()->GetPrimitiveType(), 411ff3c98775a4577cf053dba9a0c2d5c21c07b298Ian Rogers Primitive::kPrimInt); 42eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier Handle<mirror::IntArray> dimensions_array( 43eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier hs.NewHandle(down_cast<mirror::IntArray*>(dimensions_obj))); 445bb99037bef70784ae4630c2e4b81688d2a18621Mathieu Chartier mirror::Array* new_array = mirror::Array::CreateMultiArray(soa.Self(), element_class, 455bb99037bef70784ae4630c2e4b81688d2a18621Mathieu Chartier dimensions_array); 4600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(new_array); 475b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom} 485b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 490512f02dd6623c0870c11fbf3274d7462f732136Elliott Hughesstatic jobject Array_createObjectArray(JNIEnv* env, jclass, jclass javaElementClass, jint length) { 501eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers ScopedFastNativeObjectAccess soa(env); 512cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier DCHECK(javaElementClass != nullptr); 5264b6d145fa53b8dfb07a8fc2426af13f155d5a4dIan Rogers if (UNLIKELY(length < 0)) { 5362d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers ThrowNegativeArraySizeException(length); 542cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier return nullptr; 555b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom } 56b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier mirror::Class* element_class = soa.Decode<mirror::Class*>(javaElementClass); 576fac447555dc94a935b78198479cce645c837b89Ian Rogers Runtime* runtime = Runtime::Current(); 586fac447555dc94a935b78198479cce645c837b89Ian Rogers ClassLinker* class_linker = runtime->GetClassLinker(); 59b74cd29802f364b4cec88f4913fa38ade26b8fabMathieu Chartier mirror::Class* array_class = class_linker->FindArrayClass(soa.Self(), &element_class); 602cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (UNLIKELY(array_class == nullptr)) { 6100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers CHECK(soa.Self()->IsExceptionPending()); 622cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier return nullptr; 635b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom } 646fac447555dc94a935b78198479cce645c837b89Ian Rogers DCHECK(array_class->IsObjectArrayClass()); 65e598e0439ab825ea1a42fe8002b54241c6163ce6Andreas Gampe mirror::Array* new_array = mirror::ObjectArray<mirror::Object*>::Alloc( 66e598e0439ab825ea1a42fe8002b54241c6163ce6Andreas Gampe soa.Self(), array_class, length, runtime->GetHeap()->GetCurrentAllocator()); 6700f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers return soa.AddLocalReference<jobject>(new_array); 685b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom} 695b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 705b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstromstatic JNINativeMethod gMethods[] = { 711eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers NATIVE_METHOD(Array, createMultiArray, "!(Ljava/lang/Class;[I)Ljava/lang/Object;"), 721eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers NATIVE_METHOD(Array, createObjectArray, "!(Ljava/lang/Class;I)Ljava/lang/Object;"), 735b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom}; 745b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 755b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstromvoid register_java_lang_reflect_Array(JNIEnv* env) { 76eac766769e3114a078c188ea26776a81f0edb3cfElliott Hughes REGISTER_NATIVE_METHODS("java/lang/reflect/Array"); 775b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom} 785b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom 795b8e4c810a97c9dc417142b8c6e07871ae15c797Brian Carlstrom} // namespace art 80