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