summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2010-05-17 16:22:04 -0700
committerElliott Hughes <enh@google.com>2010-05-17 16:22:04 -0700
commit99c59bfa432e36933a7a5033fba8b89209f737bc (patch)
tree355ec6fb97889a196a5d885abac59cc98ff56e7a /include
parent204cab3c22b4d75c866c95e2d2eec42e14cbd924 (diff)
downloadlibcore-99c59bfa432e36933a7a5033fba8b89209f737bc.zip
libcore-99c59bfa432e36933a7a5033fba8b89209f737bc.tar.gz
libcore-99c59bfa432e36933a7a5033fba8b89209f737bc.tar.bz2
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
Diffstat (limited to 'include')
-rw-r--r--include/ScopedByteArray.h57
-rw-r--r--include/ScopedPrimitiveArray.h65
2 files changed, 65 insertions, 57 deletions
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<const char*>(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