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