Retire android::nio_{get,release}Buffer
Removes unused functions nio_getBuffer and nio_releaseBuffer. Motivated
by the observation that nio_releaseBuffer() will fail hard for
java.nio.Buffer instances backed by heap arrays when the buffer
position is non-zero.
Adds doc comments to AutoBufferPointer that is used in the framework.
Adds test cases for short and int buffers BitmapTest.
Bug: b/130390512
Test: m -j100
Test: atest FrameworksCoreTests:android.graphics.BitmapTest
Change-Id: I01fb72ed71d46a4ef8c7d3da82319ea57e391dbd
diff --git a/core/jni/android_nio_utils.cpp b/core/jni/android_nio_utils.cpp
index a62dd7c..1e6d49e 100644
--- a/core/jni/android_nio_utils.cpp
+++ b/core/jni/android_nio_utils.cpp
@@ -18,51 +18,29 @@
#include "core_jni_helpers.h"
-namespace {
+namespace android {
-void* getPointer(JNIEnv *_env, jobject buffer, jarray *array, void** elements) {
- assert(array);
- jint position;
- jint limit;
- jint elementSizeShift;
- jlong pointer = jniGetNioBufferFields(_env, buffer, &position, &limit, &elementSizeShift);
+AutoBufferPointer::AutoBufferPointer(JNIEnv* env, jobject nioBuffer, jboolean commit)
+ : fEnv(env), fCommit(commit) {
+ jlong pointer = jniGetNioBufferPointer(fEnv, nioBuffer);
if (pointer != 0L) {
- *array = nullptr;
- *elements = nullptr;
- pointer += position << elementSizeShift;
- return reinterpret_cast<void*>(pointer);
+ // Buffer is backed by a direct buffer.
+ fArray = nullptr;
+ fElements = nullptr;
+ fPointer = reinterpret_cast<void*>(pointer);
+ } else {
+ // Buffer is backed by a managed array.
+ jint byteOffset = jniGetNioBufferBaseArrayOffset(fEnv, nioBuffer);
+ fArray = jniGetNioBufferBaseArray(fEnv, nioBuffer);
+ fElements = fEnv->GetPrimitiveArrayCritical(fArray, /* isCopy= */ nullptr);
+ fPointer = reinterpret_cast<void*>(reinterpret_cast<char*>(fElements) + byteOffset);
}
- jint offset = jniGetNioBufferBaseArrayOffset(_env, buffer);
- *array = jniGetNioBufferBaseArray(_env, buffer);
- *elements = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0);
- return reinterpret_cast<void*>(reinterpret_cast<char*>(*elements) + offset);
}
-void releasePointer(JNIEnv *_env, jarray array, void *elements, jboolean commit) {
- _env->ReleasePrimitiveArrayCritical(array, elements, commit ? 0 : JNI_ABORT);
-}
-
-} // namespace
-
-void* android::nio_getPointer(JNIEnv *_env, jobject buffer, jarray *array) {
- void* elements;
- return getPointer(_env, buffer, array, &elements);
-}
-
-void android::nio_releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) {
- releasePointer(_env, array, data, commit);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-android::AutoBufferPointer::AutoBufferPointer(JNIEnv* env, jobject nioBuffer, jboolean commit) {
- fEnv = env;
- fCommit = commit;
- fPointer = getPointer(env, nioBuffer, &fArray, &fElements);
-}
-
-android::AutoBufferPointer::~AutoBufferPointer() {
+AutoBufferPointer::~AutoBufferPointer() {
if (nullptr != fArray) {
- releasePointer(fEnv, fArray, fElements, fCommit);
+ fEnv->ReleasePrimitiveArrayCritical(fArray, fElements, fCommit ? 0 : JNI_ABORT);
}
}
+
+} // namespace android