18b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers/* 28b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * Copyright (C) 2008 The Android Open Source Project 38b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * 48b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License"); 58b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * you may not use this file except in compliance with the License. 68b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * You may obtain a copy of the License at 78b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * 88b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * http://www.apache.org/licenses/LICENSE-2.0 98b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * 108b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * Unless required by applicable law or agreed to in writing, software 118b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS, 128b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * See the License for the specific language governing permissions and 148b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers * limitations under the License. 158b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers */ 168b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 17277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#include "java_lang_DexCache.h" 18277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe 198b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers#include "dex_file.h" 2068d8b42ddec39ec0174162d90d4abaa004d1983eIan Rogers#include "jni_internal.h" 21e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier#include "mirror/class-inl.h" 223481ba2c4e4f3aa80d8c6d50a9f85dacb56b508bVladimir Marko#include "mirror/dex_cache-inl.h" 238b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers#include "mirror/object-inl.h" 241eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers#include "scoped_fast_native_object_access.h" 258b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers#include "well_known_classes.h" 268b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 278b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersnamespace art { 288b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 298b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersstatic jobject DexCache_getDexNative(JNIEnv* env, jobject javaDexCache) { 301eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers ScopedFastNativeObjectAccess soa(env); 318b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 328b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers // Should only be called while holding the lock on the dex cache. 33d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers DCHECK_EQ(dex_cache->GetLockOwnerThreadId(), soa.Self()->GetThreadId()); 348b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers const DexFile* dex_file = dex_cache->GetDexFile(); 352cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (dex_file == nullptr) { 362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier return nullptr; 378b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers } 388b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers void* address = const_cast<void*>(reinterpret_cast<const void*>(dex_file->Begin())); 398b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers jobject byte_buffer = env->NewDirectByteBuffer(address, dex_file->Size()); 402cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier if (byte_buffer == nullptr) { 418b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers DCHECK(soa.Self()->IsExceptionPending()); 422cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier return nullptr; 438b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers } 448b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 458b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers jvalue args[1]; 468b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers args[0].l = byte_buffer; 478b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers return env->CallStaticObjectMethodA(WellKnownClasses::com_android_dex_Dex, 488b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers WellKnownClasses::com_android_dex_Dex_create, 498b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers args); 508b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers} 518b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 52c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Markostatic jobject DexCache_getResolvedType(JNIEnv* env, jobject javaDexCache, jint type_index) { 53c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko ScopedFastNativeObjectAccess soa(env); 54c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 5505792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK_LT(static_cast<size_t>(type_index), dex_cache->NumResolvedTypes()); 56c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko return soa.AddLocalReference<jobject>(dex_cache->GetResolvedType(type_index)); 57c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko} 58c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko 59c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Markostatic jobject DexCache_getResolvedString(JNIEnv* env, jobject javaDexCache, jint string_index) { 60c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko ScopedFastNativeObjectAccess soa(env); 61c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 6205792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK_LT(static_cast<size_t>(string_index), dex_cache->NumStrings()); 63c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko return soa.AddLocalReference<jobject>(dex_cache->GetResolvedString(string_index)); 64c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko} 65c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko 66c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Markostatic void DexCache_setResolvedType(JNIEnv* env, jobject javaDexCache, jint type_index, 67c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko jobject type) { 68c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko ScopedFastNativeObjectAccess soa(env); 69c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 7005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK_LT(static_cast<size_t>(type_index), dex_cache->NumResolvedTypes()); 71c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko dex_cache->SetResolvedType(type_index, soa.Decode<mirror::Class*>(type)); 72c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko} 73c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko 74c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Markostatic void DexCache_setResolvedString(JNIEnv* env, jobject javaDexCache, jint string_index, 75c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko jobject string) { 76c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko ScopedFastNativeObjectAccess soa(env); 77c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 7805792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko CHECK_LT(static_cast<size_t>(string_index), dex_cache->NumStrings()); 79c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko dex_cache->SetResolvedString(string_index, soa.Decode<mirror::String*>(string)); 80c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko} 81c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko 828b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersstatic JNINativeMethod gMethods[] = { 831eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers NATIVE_METHOD(DexCache, getDexNative, "!()Lcom/android/dex/Dex;"), 84c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko NATIVE_METHOD(DexCache, getResolvedType, "!(I)Ljava/lang/Class;"), 85c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko NATIVE_METHOD(DexCache, getResolvedString, "!(I)Ljava/lang/String;"), 86c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko NATIVE_METHOD(DexCache, setResolvedType, "!(ILjava/lang/Class;)V"), 87c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko NATIVE_METHOD(DexCache, setResolvedString, "!(ILjava/lang/String;)V"), 888b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers}; 898b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 908b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersvoid register_java_lang_DexCache(JNIEnv* env) { 918b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers REGISTER_NATIVE_METHODS("java/lang/DexCache"); 928b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers} 938b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 948b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers} // namespace art 95