13e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root/* 23e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * Copyright (C) 2010 The Android Open Source Project 33e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * 43e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 53e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * you may not use this file except in compliance with the License. 63e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * You may obtain a copy of the License at 73e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * 83e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * http://www.apache.org/licenses/LICENSE-2.0 93e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * 103e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * Unless required by applicable law or agreed to in writing, software 113e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 123e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * See the License for the specific language governing permissions and 143e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root * limitations under the License. 153e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root */ 163e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 173e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root#ifndef SCOPED_LOCAL_REF_H_included 183e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root#define SCOPED_LOCAL_REF_H_included 193e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 203e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root#include "jni.h" 213e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 223e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root#include <stddef.h> 233e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 243e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root// A smart pointer that deletes a JNI local reference when it goes out of scope. 253e46e4ee56c8e37158f46941dedd5b436d724baaKenny Roottemplate<typename T> 263e46e4ee56c8e37158f46941dedd5b436d724baaKenny Rootclass ScopedLocalRef { 273e46e4ee56c8e37158f46941dedd5b436d724baaKenny Rootpublic: 283e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root ScopedLocalRef(JNIEnv* env, T localRef) : mEnv(env), mLocalRef(localRef) { 293e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 303e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 313e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root ~ScopedLocalRef() { 323e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root reset(); 333e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 343e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 353e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root void reset(T ptr = NULL) { 363e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root if (ptr != mLocalRef) { 373e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root if (mLocalRef != NULL) { 383e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root mEnv->DeleteLocalRef(mLocalRef); 393e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 403e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root mLocalRef = ptr; 413e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 423e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 433e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 443e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root T release() __attribute__((warn_unused_result)) { 453e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root T localRef = mLocalRef; 463e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root mLocalRef = NULL; 473e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root return localRef; 483e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 493e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 503e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root T get() const { 513e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root return mLocalRef; 523e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root } 533e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 543e46e4ee56c8e37158f46941dedd5b436d724baaKenny Rootprivate: 553e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root JNIEnv* mEnv; 563e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root T mLocalRef; 573e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 583e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root // Disallow copy and assignment. 593e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root ScopedLocalRef(const ScopedLocalRef&); 603e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root void operator=(const ScopedLocalRef&); 613e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root}; 623e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root 633e46e4ee56c8e37158f46941dedd5b436d724baaKenny Root#endif // SCOPED_LOCAL_REF_H_included 64