Use libnativehelper to get access to NIO buffer internals
Changes to android_opengl_* are generated by editing glgen stubs and
re-running gen script.
Bug: 124338141
Test: atest CtsGraphicsTestCases
Change-Id: I715123e66f4ace1d6a11a42c8eafc1d02995e88b
diff --git a/core/jni/android_opengl_GLES30.cpp b/core/jni/android_opengl_GLES30.cpp
index 9922398..a9c0219 100644
--- a/core/jni/android_opengl_GLES30.cpp
+++ b/core/jni/android_opengl_GLES30.cpp
@@ -29,15 +29,6 @@
#include <utils/misc.h>
#include <assert.h>
-static jclass nioAccessClass;
-static jclass bufferClass;
-static jmethodID getBasePointerID;
-static jmethodID getBaseArrayID;
-static jmethodID getBaseArrayOffsetID;
-static jfieldID positionID;
-static jfieldID limitID;
-static jfieldID elementSizeShiftID;
-
/* special calls implemented in Android's GLES wrapper used to more
* efficiently bound-check passed arrays */
@@ -72,28 +63,9 @@
#endif
}
-/* Cache method IDs each time the class is loaded. */
-
static void
nativeClassInit(JNIEnv *_env, jclass glImplClass)
{
- jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess");
- nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal);
-
- jclass bufferClassLocal = _env->FindClass("java/nio/Buffer");
- bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal);
-
- getBasePointerID = _env->GetStaticMethodID(nioAccessClass,
- "getBasePointer", "(Ljava/nio/Buffer;)J");
- getBaseArrayID = _env->GetStaticMethodID(nioAccessClass,
- "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;");
- getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass,
- "getBaseArrayOffset", "(Ljava/nio/Buffer;)I");
-
- positionID = _env->GetFieldID(bufferClass, "position", "I");
- limitID = _env->GetFieldID(bufferClass, "limit", "I");
- elementSizeShiftID =
- _env->GetFieldID(bufferClass, "_elementSizeShift", "I");
}
static void *
@@ -104,23 +76,17 @@
jint elementSizeShift;
jlong pointer;
- position = _env->GetIntField(buffer, positionID);
- limit = _env->GetIntField(buffer, limitID);
- elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
+ pointer = jniGetNioBufferFields(_env, buffer, &position, &limit, &elementSizeShift);
*remaining = (limit - position) << elementSizeShift;
- pointer = _env->CallStaticLongMethod(nioAccessClass,
- getBasePointerID, buffer);
if (pointer != 0L) {
- *array = NULL;
+ *array = nullptr;
+ pointer += position << elementSizeShift;
return reinterpret_cast<void*>(pointer);
}
- *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
- getBaseArrayID, buffer);
- *offset = _env->CallStaticIntMethod(nioAccessClass,
- getBaseArrayOffsetID, buffer);
-
- return NULL;
+ *array = jniGetNioBufferBaseArray(_env, buffer);
+ *offset = jniGetNioBufferBaseArrayOffset(_env, buffer);
+ return nullptr;
}
class ByteArrayGetter {
@@ -242,16 +208,18 @@
static void *
getDirectBufferPointer(JNIEnv *_env, jobject buffer) {
- char* buf = (char*) _env->GetDirectBufferAddress(buffer);
- if (buf) {
- jint position = _env->GetIntField(buffer, positionID);
- jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
- buf += position << elementSizeShift;
- } else {
+ jint position;
+ jint limit;
+ jint elementSizeShift;
+ jlong pointer;
+ pointer = jniGetNioBufferFields(_env, buffer, &position, &limit, &elementSizeShift);
+ if (pointer == 0) {
jniThrowException(_env, "java/lang/IllegalArgumentException",
"Must use a native order direct Buffer");
+ return nullptr;
}
- return (void*) buf;
+ pointer += position << elementSizeShift;
+ return reinterpret_cast<void*>(pointer);
}
// --------------------------------------------------------------------------