java_lang_DexCache.cc revision c136312832d4be25db2ecc5673967d71d0ad4b9c
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" 218b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers#include "mirror/dex_cache.h" 228b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers#include "mirror/object-inl.h" 231eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers#include "scoped_fast_native_object_access.h" 248b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers#include "well_known_classes.h" 258b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 268b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersnamespace art { 278b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 288b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersstatic jobject DexCache_getDexNative(JNIEnv* env, jobject javaDexCache) { 291eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers ScopedFastNativeObjectAccess soa(env); 308b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 318b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers // Should only be called while holding the lock on the dex cache. 32d9c4fc94fa618617f94e1de9af5f034549100753Ian Rogers DCHECK_EQ(dex_cache->GetLockOwnerThreadId(), soa.Self()->GetThreadId()); 338b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers const DexFile* dex_file = dex_cache->GetDexFile(); 348b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers if (dex_file == NULL) { 358b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers return NULL; 368b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers } 378b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers void* address = const_cast<void*>(reinterpret_cast<const void*>(dex_file->Begin())); 388b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers jobject byte_buffer = env->NewDirectByteBuffer(address, dex_file->Size()); 398b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers if (byte_buffer == NULL) { 408b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers DCHECK(soa.Self()->IsExceptionPending()); 418b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers return NULL; 428b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers } 438b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 448b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers jvalue args[1]; 458b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers args[0].l = byte_buffer; 468b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers return env->CallStaticObjectMethodA(WellKnownClasses::com_android_dex_Dex, 478b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers WellKnownClasses::com_android_dex_Dex_create, 488b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers args); 498b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers} 508b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 51c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Markostatic jobject DexCache_getResolvedType(JNIEnv* env, jobject javaDexCache, jint type_index) { 52c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko ScopedFastNativeObjectAccess soa(env); 53c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 54c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko return soa.AddLocalReference<jobject>(dex_cache->GetResolvedType(type_index)); 55c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko} 56c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko 57c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Markostatic jobject DexCache_getResolvedString(JNIEnv* env, jobject javaDexCache, jint string_index) { 58c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko ScopedFastNativeObjectAccess soa(env); 59c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 60c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko return soa.AddLocalReference<jobject>(dex_cache->GetResolvedString(string_index)); 61c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko} 62c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko 63c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Markostatic void DexCache_setResolvedType(JNIEnv* env, jobject javaDexCache, jint type_index, 64c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko jobject type) { 65c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko ScopedFastNativeObjectAccess soa(env); 66c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 67c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko dex_cache->SetResolvedType(type_index, soa.Decode<mirror::Class*>(type)); 68c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko} 69c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko 70c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Markostatic void DexCache_setResolvedString(JNIEnv* env, jobject javaDexCache, jint string_index, 71c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko jobject string) { 72c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko ScopedFastNativeObjectAccess soa(env); 73c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko mirror::DexCache* dex_cache = soa.Decode<mirror::DexCache*>(javaDexCache); 74c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko dex_cache->SetResolvedString(string_index, soa.Decode<mirror::String*>(string)); 75c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko} 76c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko 778b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersstatic JNINativeMethod gMethods[] = { 781eb512d33f94d1dd7ea38263307ba0f7a0dfa653Ian Rogers NATIVE_METHOD(DexCache, getDexNative, "!()Lcom/android/dex/Dex;"), 79c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko NATIVE_METHOD(DexCache, getResolvedType, "!(I)Ljava/lang/Class;"), 80c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko NATIVE_METHOD(DexCache, getResolvedString, "!(I)Ljava/lang/String;"), 81c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko NATIVE_METHOD(DexCache, setResolvedType, "!(ILjava/lang/Class;)V"), 82c136312832d4be25db2ecc5673967d71d0ad4b9cVladimir Marko NATIVE_METHOD(DexCache, setResolvedString, "!(ILjava/lang/String;)V"), 838b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers}; 848b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 858b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogersvoid register_java_lang_DexCache(JNIEnv* env) { 868b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers REGISTER_NATIVE_METHODS("java/lang/DexCache"); 878b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers} 888b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers 898b2c0b9abc3f520495f4387ea040132ba85cae69Ian Rogers} // namespace art 90