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:
- GetPrimitiveArrayCritical could return NULL, so using that _ptr1 isn’t recommended
- 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);
}