possible glGetDoublev implementation problem

after some discussion in java-dev Apple’s list
I took a look at glGetDoublev implementation:


JNIEXPORT void JNICALL
Java_net_java_games_jogl_impl_macosx_MacOSXGLImpl_glGetDoublev(JNIEnv *env, jobject _unused, jint pname, jdoubleArray params) {
  GLdouble * _ptr1 = NULL;
  if (params != NULL) {
    _ptr1 = (GLdouble *) (*env)->GetPrimitiveArrayCritical(env, params, NULL);
  }
  glGetDoublev((GLenum) pname, (GLdouble *) _ptr1);
  if (params != NULL) {
    (*env)->ReleasePrimitiveArrayCritical(env, params, _ptr1, JNI_ABORT);
  }
}

I can see at least 2 possible problem there:

  1. GetPrimitiveArrayCritical could return NULL, so using that _ptr1 isn’t recommended
  2. GetPrimitiveArrayCritical could use copy, so JNI_ABORT isn’t appropriate in ReleasePrimitiveArrayCritical

and just comment (GLdouble ) casting in glGetDoublev
isn’t necessary, because _ptr1 was declared as GLdouble

so I’d recommend the following code instead


JNIEXPORT void JNICALL
Java_net_java_games_jogl_impl_macosx_MacOSXGLImpl_glGetDoublev(JNIEnv *env, jobject _unused, jint pname, jdoubleArray params) {
        GLdouble * _ptr1 = NULL;
      jboolean isCopiedArray = JNI_FALSE;
        if (params == NULL)  return;
          _ptr1 = (GLdouble *) (*env)->GetPrimitiveArrayCritical(env, params,& isCopiedArray);
      if(_ptr1 == NULL) return;
        glGetDoublev((GLenum) pname,  _ptr1);
          (*env)->ReleasePrimitiveArrayCritical(env, params, _ptr1,(isCopiedArray == JNI_TRUE)?0:JNI_ABORT);
}