Loading core/jni/AndroidRuntime.cpp +0 −2 Original line number Diff line number Diff line Loading @@ -174,7 +174,6 @@ extern int register_android_database_CursorWindow(JNIEnv* env); extern int register_android_database_SQLiteConnection(JNIEnv* env); extern int register_android_database_SQLiteGlobal(JNIEnv* env); extern int register_android_database_SQLiteDebug(JNIEnv* env); extern int register_android_nio_utils(JNIEnv* env); extern int register_android_os_Debug(JNIEnv* env); extern int register_android_os_GraphicsEnvironment(JNIEnv* env); extern int register_android_os_HidlSupport(JNIEnv* env); Loading Loading @@ -1422,7 +1421,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_NativeHandle), REG_JNI(register_android_os_VintfObject), REG_JNI(register_android_os_VintfRuntimeInfo), REG_JNI(register_android_nio_utils), REG_JNI(register_android_graphics_Canvas), // This needs to be before register_android_graphics_Graphics, or the latter // will not be able to find the jmethodID for ColorSpace.get(). Loading core/jni/android/opengl/util.cpp +4 −41 Original line number Diff line number Diff line Loading @@ -773,54 +773,18 @@ static jint util_texSubImage2D(JNIEnv *env, jclass clazz, * ETC1 methods. */ static jclass nioAccessClass; static jclass bufferClass; static jmethodID getBasePointerID; static jmethodID getBaseArrayID; static jmethodID getBaseArrayOffsetID; static jfieldID positionID; static jfieldID limitID; static jfieldID elementSizeShiftID; /* Cache method IDs each time the class is loaded. */ static void nativeClassInitBuffer(JNIEnv *env) { jclass nioAccessClassLocal = FindClassOrDie(env, "java/nio/NIOAccess"); nioAccessClass = MakeGlobalRefOrDie(env, nioAccessClassLocal); getBasePointerID = GetStaticMethodIDOrDie(env, nioAccessClass, "getBasePointer", "(Ljava/nio/Buffer;)J"); getBaseArrayID = GetStaticMethodIDOrDie(env, nioAccessClass, "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); getBaseArrayOffsetID = GetStaticMethodIDOrDie(env, nioAccessClass, "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); jclass bufferClassLocal = FindClassOrDie(env, "java/nio/Buffer"); bufferClass = MakeGlobalRefOrDie(env, bufferClassLocal); positionID = GetFieldIDOrDie(env, bufferClass, "position", "I"); limitID = GetFieldIDOrDie(env, bufferClass, "limit", "I"); elementSizeShiftID = GetFieldIDOrDie(env, bufferClass, "_elementSizeShift", "I"); } static void * getPointer(JNIEnv *_env, jobject buffer, jint *remaining) { jint position; jint limit; jint elementSizeShift; jlong pointer; position = _env->GetIntField(buffer, positionID); limit = _env->GetIntField(buffer, limitID); elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); *remaining = (limit - position) << elementSizeShift; pointer = _env->CallStaticLongMethod(nioAccessClass, getBasePointerID, buffer); jlong pointer = jniGetNioBufferFields(_env, buffer, &position, &limit, &elementSizeShift); if (pointer != 0L) { return reinterpret_cast<void *>(pointer); pointer += position << elementSizeShift; } return NULL; *remaining = (limit - position) << elementSizeShift; return reinterpret_cast<void*>(pointer); } class BufferHelper { Loading Loading @@ -1101,7 +1065,6 @@ static const ClassRegistrationInfo gClasses[] = { int register_android_opengl_classes(JNIEnv* env) { nativeClassInitBuffer(env); int result = 0; for (int i = 0; i < NELEM(gClasses); i++) { const ClassRegistrationInfo* cri = &gClasses[i]; Loading core/jni/android_nio_utils.cpp +10 −46 Original line number Diff line number Diff line Loading @@ -18,37 +18,22 @@ #include "core_jni_helpers.h" struct NioJNIData { jclass nioAccessClass; jmethodID getBasePointerID; jmethodID getBaseArrayID; jmethodID getBaseArrayOffsetID; }; static NioJNIData gNioJNI; void* android::nio_getPointer(JNIEnv *_env, jobject buffer, jarray *array) { assert(array); jlong pointer; jint offset; void *data; pointer = _env->CallStaticLongMethod(gNioJNI.nioAccessClass, gNioJNI.getBasePointerID, buffer); jint position; jint limit; jint elementSizeShift; jlong pointer = jniGetNioBufferFields(_env, buffer, &position, &limit, &elementSizeShift); if (pointer != 0L) { *array = NULL; pointer += position << elementSizeShift; return reinterpret_cast<void*>(pointer); } *array = (jarray) _env->CallStaticObjectMethod(gNioJNI.nioAccessClass, gNioJNI.getBaseArrayID, buffer); offset = _env->CallStaticIntMethod(gNioJNI.nioAccessClass, gNioJNI.getBaseArrayOffsetID, buffer); data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0); return (void *) ((char *) data + offset); jint offset = jniGetNioBufferBaseArrayOffset(_env, buffer); *array = jniGetNioBufferBaseArray(_env, buffer); void * data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0); return reinterpret_cast<void*>(reinterpret_cast<char*>(data) + offset); } Loading @@ -72,24 +57,3 @@ android::AutoBufferPointer::~AutoBufferPointer() { android::nio_releasePointer(fEnv, fArray, fPointer, fCommit); } } /////////////////////////////////////////////////////////////////////////////// namespace android { int register_android_nio_utils(JNIEnv* env) { jclass localClass = FindClassOrDie(env, "java/nio/NIOAccess"); gNioJNI.getBasePointerID = GetStaticMethodIDOrDie(env, localClass, "getBasePointer", "(Ljava/nio/Buffer;)J"); gNioJNI.getBaseArrayID = GetStaticMethodIDOrDie(env, localClass, "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); gNioJNI.getBaseArrayOffsetID = GetStaticMethodIDOrDie(env, localClass, "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); // now record a permanent version of the class ID gNioJNI.nioAccessClass = MakeGlobalRefOrDie(env, localClass); return 0; } } core/jni/android_opengl_EGL15.cpp +6 −40 Original line number Diff line number Diff line Loading @@ -35,16 +35,6 @@ static jclass egldisplayClass; static jclass eglsurfaceClass; static jclass eglconfigClass; static jclass eglcontextClass; static jclass bufferClass; static jclass nioAccessClass; static jfieldID positionID; static jfieldID limitID; static jfieldID elementSizeShiftID; static jmethodID getBasePointerID; static jmethodID getBaseArrayID; static jmethodID getBaseArrayOffsetID; static jmethodID egldisplayGetHandleID; static jmethodID eglconfigGetHandleID; Loading Loading @@ -116,24 +106,6 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass) _env->SetStaticObjectField(eglClass, noSurfaceFieldID, eglNoSurfaceObject); // EGL 1.5 init 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"); jclass eglimageClassLocal = _env->FindClass("android/opengl/EGLImage"); eglimageClass = (jclass) _env->NewGlobalRef(eglimageClassLocal); jclass eglsyncClassLocal = _env->FindClass("android/opengl/EGLSync"); Loading @@ -160,23 +132,17 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *o 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; } static void Loading core/jni/android_opengl_GLES10.cpp +15 −47 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -72,28 +63,9 @@ static void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type, #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 * Loading @@ -104,23 +76,17 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *o 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 { Loading Loading @@ -242,16 +208,18 @@ releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) 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); } // -------------------------------------------------------------------------- Loading Loading
core/jni/AndroidRuntime.cpp +0 −2 Original line number Diff line number Diff line Loading @@ -174,7 +174,6 @@ extern int register_android_database_CursorWindow(JNIEnv* env); extern int register_android_database_SQLiteConnection(JNIEnv* env); extern int register_android_database_SQLiteGlobal(JNIEnv* env); extern int register_android_database_SQLiteDebug(JNIEnv* env); extern int register_android_nio_utils(JNIEnv* env); extern int register_android_os_Debug(JNIEnv* env); extern int register_android_os_GraphicsEnvironment(JNIEnv* env); extern int register_android_os_HidlSupport(JNIEnv* env); Loading Loading @@ -1422,7 +1421,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_NativeHandle), REG_JNI(register_android_os_VintfObject), REG_JNI(register_android_os_VintfRuntimeInfo), REG_JNI(register_android_nio_utils), REG_JNI(register_android_graphics_Canvas), // This needs to be before register_android_graphics_Graphics, or the latter // will not be able to find the jmethodID for ColorSpace.get(). Loading
core/jni/android/opengl/util.cpp +4 −41 Original line number Diff line number Diff line Loading @@ -773,54 +773,18 @@ static jint util_texSubImage2D(JNIEnv *env, jclass clazz, * ETC1 methods. */ static jclass nioAccessClass; static jclass bufferClass; static jmethodID getBasePointerID; static jmethodID getBaseArrayID; static jmethodID getBaseArrayOffsetID; static jfieldID positionID; static jfieldID limitID; static jfieldID elementSizeShiftID; /* Cache method IDs each time the class is loaded. */ static void nativeClassInitBuffer(JNIEnv *env) { jclass nioAccessClassLocal = FindClassOrDie(env, "java/nio/NIOAccess"); nioAccessClass = MakeGlobalRefOrDie(env, nioAccessClassLocal); getBasePointerID = GetStaticMethodIDOrDie(env, nioAccessClass, "getBasePointer", "(Ljava/nio/Buffer;)J"); getBaseArrayID = GetStaticMethodIDOrDie(env, nioAccessClass, "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); getBaseArrayOffsetID = GetStaticMethodIDOrDie(env, nioAccessClass, "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); jclass bufferClassLocal = FindClassOrDie(env, "java/nio/Buffer"); bufferClass = MakeGlobalRefOrDie(env, bufferClassLocal); positionID = GetFieldIDOrDie(env, bufferClass, "position", "I"); limitID = GetFieldIDOrDie(env, bufferClass, "limit", "I"); elementSizeShiftID = GetFieldIDOrDie(env, bufferClass, "_elementSizeShift", "I"); } static void * getPointer(JNIEnv *_env, jobject buffer, jint *remaining) { jint position; jint limit; jint elementSizeShift; jlong pointer; position = _env->GetIntField(buffer, positionID); limit = _env->GetIntField(buffer, limitID); elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID); *remaining = (limit - position) << elementSizeShift; pointer = _env->CallStaticLongMethod(nioAccessClass, getBasePointerID, buffer); jlong pointer = jniGetNioBufferFields(_env, buffer, &position, &limit, &elementSizeShift); if (pointer != 0L) { return reinterpret_cast<void *>(pointer); pointer += position << elementSizeShift; } return NULL; *remaining = (limit - position) << elementSizeShift; return reinterpret_cast<void*>(pointer); } class BufferHelper { Loading Loading @@ -1101,7 +1065,6 @@ static const ClassRegistrationInfo gClasses[] = { int register_android_opengl_classes(JNIEnv* env) { nativeClassInitBuffer(env); int result = 0; for (int i = 0; i < NELEM(gClasses); i++) { const ClassRegistrationInfo* cri = &gClasses[i]; Loading
core/jni/android_nio_utils.cpp +10 −46 Original line number Diff line number Diff line Loading @@ -18,37 +18,22 @@ #include "core_jni_helpers.h" struct NioJNIData { jclass nioAccessClass; jmethodID getBasePointerID; jmethodID getBaseArrayID; jmethodID getBaseArrayOffsetID; }; static NioJNIData gNioJNI; void* android::nio_getPointer(JNIEnv *_env, jobject buffer, jarray *array) { assert(array); jlong pointer; jint offset; void *data; pointer = _env->CallStaticLongMethod(gNioJNI.nioAccessClass, gNioJNI.getBasePointerID, buffer); jint position; jint limit; jint elementSizeShift; jlong pointer = jniGetNioBufferFields(_env, buffer, &position, &limit, &elementSizeShift); if (pointer != 0L) { *array = NULL; pointer += position << elementSizeShift; return reinterpret_cast<void*>(pointer); } *array = (jarray) _env->CallStaticObjectMethod(gNioJNI.nioAccessClass, gNioJNI.getBaseArrayID, buffer); offset = _env->CallStaticIntMethod(gNioJNI.nioAccessClass, gNioJNI.getBaseArrayOffsetID, buffer); data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0); return (void *) ((char *) data + offset); jint offset = jniGetNioBufferBaseArrayOffset(_env, buffer); *array = jniGetNioBufferBaseArray(_env, buffer); void * data = _env->GetPrimitiveArrayCritical(*array, (jboolean *) 0); return reinterpret_cast<void*>(reinterpret_cast<char*>(data) + offset); } Loading @@ -72,24 +57,3 @@ android::AutoBufferPointer::~AutoBufferPointer() { android::nio_releasePointer(fEnv, fArray, fPointer, fCommit); } } /////////////////////////////////////////////////////////////////////////////// namespace android { int register_android_nio_utils(JNIEnv* env) { jclass localClass = FindClassOrDie(env, "java/nio/NIOAccess"); gNioJNI.getBasePointerID = GetStaticMethodIDOrDie(env, localClass, "getBasePointer", "(Ljava/nio/Buffer;)J"); gNioJNI.getBaseArrayID = GetStaticMethodIDOrDie(env, localClass, "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;"); gNioJNI.getBaseArrayOffsetID = GetStaticMethodIDOrDie(env, localClass, "getBaseArrayOffset", "(Ljava/nio/Buffer;)I"); // now record a permanent version of the class ID gNioJNI.nioAccessClass = MakeGlobalRefOrDie(env, localClass); return 0; } }
core/jni/android_opengl_EGL15.cpp +6 −40 Original line number Diff line number Diff line Loading @@ -35,16 +35,6 @@ static jclass egldisplayClass; static jclass eglsurfaceClass; static jclass eglconfigClass; static jclass eglcontextClass; static jclass bufferClass; static jclass nioAccessClass; static jfieldID positionID; static jfieldID limitID; static jfieldID elementSizeShiftID; static jmethodID getBasePointerID; static jmethodID getBaseArrayID; static jmethodID getBaseArrayOffsetID; static jmethodID egldisplayGetHandleID; static jmethodID eglconfigGetHandleID; Loading Loading @@ -116,24 +106,6 @@ nativeClassInit(JNIEnv *_env, jclass glImplClass) _env->SetStaticObjectField(eglClass, noSurfaceFieldID, eglNoSurfaceObject); // EGL 1.5 init 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"); jclass eglimageClassLocal = _env->FindClass("android/opengl/EGLImage"); eglimageClass = (jclass) _env->NewGlobalRef(eglimageClassLocal); jclass eglsyncClassLocal = _env->FindClass("android/opengl/EGLSync"); Loading @@ -160,23 +132,17 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *o 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; } static void Loading
core/jni/android_opengl_GLES10.cpp +15 −47 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -72,28 +63,9 @@ static void glVertexAttribIPointerBounds(GLuint indx, GLint size, GLenum type, #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 * Loading @@ -104,23 +76,17 @@ getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *o 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 { Loading Loading @@ -242,16 +208,18 @@ releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit) 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); } // -------------------------------------------------------------------------- Loading