From 99c59bfa432e36933a7a5033fba8b89209f737bc Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 17 May 2010 16:22:04 -0700 Subject: Expand upon the old ScopedByteArray, and start removing some of the Get/ReleaseCritical calls. This adds Scoped*Array classes for all primitive types, and switches all read-only users of arrays over. At the same time, all read-only users of Get/ReleaseCritical get switched to non-critical access. Bug: 2663177 Change-Id: I5542cea3e24faa987ced463fcb695b9598da94af --- include/ScopedByteArray.h | 57 ------------------------------------ include/ScopedPrimitiveArray.h | 65 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 57 deletions(-) delete mode 100644 include/ScopedByteArray.h create mode 100644 include/ScopedPrimitiveArray.h (limited to 'include') diff --git a/include/ScopedByteArray.h b/include/ScopedByteArray.h deleted file mode 100644 index 6955b70..0000000 --- a/include/ScopedByteArray.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2009 The Android Open Source Project - - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SCOPED_BYTE_ARRAY_H_included -#define SCOPED_BYTE_ARRAY_H_included - -#include "JNIHelp.h" - -// A smart pointer that provides read-only access to a Java byte[]. -class ScopedByteArray { -public: - ScopedByteArray(JNIEnv* env, jbyteArray byteArray) - : mEnv(env), mByteArray(byteArray), mBytes(NULL) - { - mBytes = env->GetByteArrayElements(mByteArray, NULL); - } - - ~ScopedByteArray() { - if (mBytes) { - mEnv->ReleaseByteArrayElements(mByteArray, mBytes, JNI_ABORT); - } - } - - const jbyte* bytes() const { - return mBytes; - } - - // Element access. - const char& operator[](size_t n) const { - const char* array = reinterpret_cast(mBytes); - return array[n]; - } - -private: - JNIEnv* mEnv; - jbyteArray mByteArray; - jbyte* mBytes; - - // Disallow copy and assignment. - ScopedByteArray(const ScopedByteArray&); - void operator=(const ScopedByteArray&); -}; - -#endif // SCOPED_BYTE_ARRAY_H_included diff --git a/include/ScopedPrimitiveArray.h b/include/ScopedPrimitiveArray.h new file mode 100644 index 0000000..b3b16e1 --- /dev/null +++ b/include/ScopedPrimitiveArray.h @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SCOPED_PRIMITIVE_ARRAY_H_included +#define SCOPED_PRIMITIVE_ARRAY_H_included + +#include "JNIHelp.h" + +// ScopedBooleanArray, ScopedByteArray, ScopedCharArray, ScopedDoubleArray, ScopedFloatArray, +// ScopedIntArray, ScopedLongArray, and ScopedShortArray provide convenient read-only access to +// Java arrays from JNI code. +#define INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(PRIMITIVE_TYPE, NAME) \ + class Scoped ## NAME ## Array { \ + public: \ + Scoped ## NAME ## Array(JNIEnv* env, PRIMITIVE_TYPE ## Array javaArray) \ + : mEnv(env), mJavaArray(javaArray), mRawArray(NULL) { \ + mRawArray = mEnv->Get ## NAME ## ArrayElements(mJavaArray, NULL); \ + } \ + ~Scoped ## NAME ## Array() { \ + if (mRawArray) { \ + mEnv->Release ## NAME ## ArrayElements(mJavaArray, mRawArray, JNI_ABORT); \ + } \ + } \ + const PRIMITIVE_TYPE* get() const { \ + return mRawArray; \ + } \ + const PRIMITIVE_TYPE& operator[](size_t n) const { \ + return mRawArray[n]; \ + } \ + size_t size() const { \ + return mEnv->GetArrayLength(mJavaArray); \ + } \ + private: \ + JNIEnv* mEnv; \ + PRIMITIVE_TYPE ## Array mJavaArray; \ + PRIMITIVE_TYPE* mRawArray; \ + Scoped ## NAME ## Array(const Scoped ## NAME ## Array&); \ + void operator=(const Scoped ## NAME ## Array&); \ + } + +INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(jboolean, Boolean); +INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(jbyte, Byte); +INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(jchar, Char); +INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(jdouble, Double); +INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(jfloat, Float); +INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(jint, Int); +INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(jlong, Long); +INSTANTIATE_SCOPED_PRIMITIVE_ARRAY(jshort, Short); + +#undef INSTANTIATE_SCOPED_PRIMITIVE_ARRAY + +#endif // SCOPED_PRIMITIVE_ARRAY_H_included -- cgit v1.1