static void *
getDirectBufferPointer(JNIEnv *_env, jobject buffer) {
    if (!buffer) {
        return NULL;
    }
    void* buf = _env->GetDirectBufferAddress(buffer);
    if (buf) {
        jint position = _env->GetIntField(buffer, positionID);
        jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
        buf = ((char*) buf) + (position << elementSizeShift);
    } else {
        if (allowIndirectBuffers(_env)) {
            jarray array = 0;
            jint remaining;
            jint offset;
            buf = getPointer(_env, buffer, &array, &remaining, &offset);
            if (array) {
                releasePointer(_env, array, buf, 0);
            }
            buf = (char*)buf + offset;
        } else {
            jniThrowException(_env, "java/lang/IllegalArgumentException",
                              "Must use a native order direct Buffer");
        }
    }
    return buf;
}
Beispiel #2
0
static void *
getDirectBufferPointer(JNIEnv *_env, jobject buffer) {
    if (!buffer) {
        return NULL;
    }
    void* buf = _env->GetDirectBufferAddress(buffer);
    if (buf) {
        jint position = _env->GetIntField(buffer, positionID);
        jint elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
        buf = ((char*) buf) + (position << elementSizeShift);
    } else {
        if (allowIndirectBuffers(_env)) {
            jarray array = 0;
            jint remaining;
            buf = getPointer(_env, buffer, &array, &remaining);
            if (array) {
                releasePointer(_env, array, buf, 0);
            }
        } else {
            _env->ThrowNew(IAEClass, "Must use a native order direct Buffer");
        }
    }
    return buf;
}