178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier/*
278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * Copyright (C) 2014 The Android Open Source Project
378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier *
478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License");
578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * you may not use this file except in compliance with the License.
678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * You may obtain a copy of the License at
778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier *
878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier *      http://www.apache.org/licenses/LICENSE-2.0
978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier *
1078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * Unless required by applicable law or agreed to in writing, software
1178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS,
1278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * See the License for the specific language governing permissions and
1478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier * limitations under the License.
1578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier */
1678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier
17277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe#include "java_lang_ref_Reference.h"
18277ccbd200ea43590dfc06a93ae184a765327ad0Andreas Gampe
1978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "gc/heap.h"
2078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "gc/reference_processor.h"
2178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "jni_internal.h"
2278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "mirror/object-inl.h"
2378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "mirror/reference-inl.h"
2478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier#include "scoped_fast_native_object_access.h"
2578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier
2678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartiernamespace art {
2778f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier
28cd48f2d86197d4fe87cc88077bc4af5ba66e5295Mathieu Chartierstatic jobject Reference_getReferent(JNIEnv* env, jobject javaThis) {
2978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier  ScopedFastNativeObjectAccess soa(env);
3078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier  mirror::Reference* const ref = soa.Decode<mirror::Reference*>(javaThis);
3178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier  mirror::Object* const referent =
3278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier      Runtime::Current()->GetHeap()->GetReferenceProcessor()->GetReferent(soa.Self(), ref);
3378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier  return soa.AddLocalReference<jobject>(referent);
3478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier}
3578f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier
3678f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartierstatic JNINativeMethod gMethods[] = {
37cd48f2d86197d4fe87cc88077bc4af5ba66e5295Mathieu Chartier  NATIVE_METHOD(Reference, getReferent, "!()Ljava/lang/Object;"),
3878f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier};
3978f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier
4078f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartiervoid register_java_lang_ref_Reference(JNIEnv* env) {
4178f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier  REGISTER_NATIVE_METHODS("java/lang/ref/Reference");
4278f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier}
4378f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier
4478f7b4c04ab6e8b5581921bc95b67a9beee1c246Mathieu Chartier}  // namespace art
45