예제 #1
0
saj_returnCode
saj_LookupTypeSupportConstructorSignature(
    JNIEnv* env,
    jobject jtypeSupport,
    gapi_char** result)
{
    jfieldID fid;
    jstring jresult;
    saj_returnCode rc;
    const char* data;

    rc = SAJ_RETCODE_ERROR;

    if(jtypeSupport != NULL)
    {
        fid = GET_CACHED(typeSupportConstructorSignature_fid);

        if(fid != NULL)
        {
            jresult = (jstring)((*env)->GetObjectField(env, jtypeSupport, fid));
            saj_exceptionCheck(env);

            if(jresult != NULL){
                data = (*env)->GetStringUTFChars(env, jresult, 0);
                saj_exceptionCheck(env);
                *result = gapi_string_dup(data);
                (*env)->ReleaseStringUTFChars(env, jresult, data);
                saj_exceptionCheck(env);
            }
            rc = SAJ_RETCODE_OK;
        }
    }
    return rc;
}
예제 #2
0
saj_returnCode
checkJavaObject(
    JNIEnv *env,
    jobject java_object)
{
    saj_returnCode rc;
    jclass tempClass;

    rc = SAJ_RETCODE_ERROR;

    if(java_object != NULL){
        /* make sure there is a reference to SajSuperClass */
        if (GET_CACHED(gapiSuperClass_class) == NULL){
            tempClass = (*env)->FindClass(env, "org/opensplice/dds/dcps/SajSuperClass");
            saj_exceptionCheck(env);
            SET_CACHED(gapiSuperClass_class, (*env)->NewGlobalRef(env, tempClass));
            saj_exceptionCheck(env);
            (*env)->DeleteLocalRef(env, tempClass);
            saj_exceptionCheck(env);
        }

        /* Verify the java_object is an instance of SajSuperClass */
        if((*env)->IsInstanceOf(env, java_object, GET_CACHED(gapiSuperClass_class))){
            rc = SAJ_RETCODE_OK;
        }
        saj_exceptionCheck(env);
    }
    return rc;
}
예제 #3
0
PA_ADDRCAST
saj_read_gapi_address(
    JNIEnv *env,
    jobject java_object)
{
    PA_ADDRCAST returnValue;
    saj_returnCode rc;

    returnValue = 0;

    if(java_object != NULL){
        rc = checkJavaObject(env, java_object);

        if(rc == SAJ_RETCODE_OK){
            if(GET_CACHED(sajSuperClassGapiPeer_fid) == NULL){
                SET_CACHED(sajSuperClassGapiPeer_fid, (*env)->GetFieldID(env, GET_CACHED(gapiSuperClass_class), "gapiObject", "J"));
                saj_exceptionCheck(env);
            }
            /* read field gapiObject from the object */
            returnValue = (PA_ADDRCAST)(*env)->GetLongField(env, java_object, GET_CACHED(sajSuperClassGapiPeer_fid));
            saj_exceptionCheck(env);
        }
    }
	return returnValue;
}
예제 #4
0
saj_returnCode
saj_stringSequenceCopyIn(
    JNIEnv *env,
    jobjectArray stringArray,
    gapi_stringSeq *out)
{
    jobject             javaString;
    const gapi_char*    vm_managed_c_string;
    jsize               arrayLength;
    int                 i;
    saj_returnCode      rc;

    assert(out != NULL);
    assert(stringArray != NULL);

    javaString = NULL;
    vm_managed_c_string = NULL;
    arrayLength = 0;
    i = 0;
    rc = SAJ_RETCODE_OK;
    arrayLength = (*env)->GetArrayLength(env, stringArray);
    saj_exceptionCheck(env);

    if (stringArray != NULL)
    {
        out->_maximum = arrayLength;
        out->_length = arrayLength;
        /* allocate a buffer of the right size */
        out->_buffer = gapi_stringSeq_allocbuf(arrayLength);
        out->_release = FALSE;

        /* fill the string buffer with strings */
        for (i = 0; i < arrayLength && rc == SAJ_RETCODE_OK; i++)
        {
            /* get the java String from the array */
            javaString = (*env)->GetObjectArrayElement(env, stringArray, i);
            saj_exceptionCheck(env);

            /* translate the java string to a c string */
            vm_managed_c_string = (*env)->GetStringUTFChars(env, javaString, 0);
            saj_exceptionCheck(env);

            if(vm_managed_c_string != NULL)
            {
                /* copy the c sting to the buffer */
                out->_buffer[i] = gapi_string_dup(vm_managed_c_string);
            }
            else
            {
                rc = SAJ_RETCODE_ERROR; /* VM has thrown an OutOfMemoryError */
            }

            /* release local references */
            (*env)->ReleaseStringUTFChars(env, javaString, vm_managed_c_string);
            saj_exceptionCheck(env);
        }
    }

    return rc;
}
예제 #5
0
saj_returnCode
saj_statusCopyOutQosPolicyCountSeq(
    JNIEnv *env,
    gapi_qosPolicyCountSeq *src,
    jobjectArray* dst)
{
    saj_returnCode rc; 
    jclass cls;
    unsigned int i;
    jobject jcount;
    
    rc = SAJ_RETCODE_OK;
    assert(dst != NULL);

    cls = GET_CACHED(qosPolicyCount_class);
    *dst = (*env)->NewObjectArray(env, src->_length, cls, NULL);
    saj_exceptionCheck(env);
    

    for(i=0; (i<src->_length) && (rc == SAJ_RETCODE_OK); i++){
        rc = saj_statusCopyOutQosPolicyCount(env, 
                                    &src->_buffer[i], 
                                    &jcount);
        (*env)->SetObjectArrayElement(env, *dst, (jsize)i, jcount);
        saj_exceptionCheck(env);
        (*env)->DeleteLocalRef(env, jcount);
        saj_exceptionCheck(env);
    }    
    return rc;
}
예제 #6
0
saj_returnCode
saj_sampleInfoHolderCopyOut(
    JNIEnv              *env,
    gapi_sampleInfo	*src,
    jobject             *dst)
{
    jobject sampleInfo;
    jobject si;

    assert (dst);
    assert (*dst);

    sampleInfo = (*env)->GetObjectField (env, *dst, GET_CACHED(sampleInfoHolder_value_fid));
    saj_exceptionCheck(env);
    si = sampleInfo;

    if (saj_sampleInfoCopyOut (env, src, &sampleInfo) == SAJ_RETCODE_ERROR) {
	   return SAJ_RETCODE_ERROR;
    }
    if (sampleInfo != si) {
        (*env)->SetObjectField (env, *dst, GET_CACHED(sampleInfoHolder_value_fid), sampleInfo);
        saj_exceptionCheck(env);
    }
    return SAJ_RETCODE_OK;
}
예제 #7
0
saj_returnCode
saj_create_new_typed_java_object(
    JNIEnv *env,
    const char *classname,
    jobject *new_java_object,
    const char *constructorSignature,
    jobject typeSupport)
{
    jclass  newClass;
    jmethodID constructorId;
    jobject newObject;
    saj_returnCode rc;

    assert(new_java_object != NULL);

    rc = SAJ_RETCODE_ERROR;
    newClass = (*env)->FindClass(env, classname);
    saj_exceptionCheck(env);

    if (newClass != NULL){
        constructorId = (*env)->GetMethodID(env, newClass, "<init>", constructorSignature);
        saj_exceptionCheck(env);

        if (constructorId != NULL){
            newObject = (*env)->NewObject(env, newClass, constructorId, typeSupport);
            saj_exceptionCheck(env);

            if(newObject != NULL){
                *new_java_object = newObject;
                rc = SAJ_RETCODE_OK;
            }
        }
    }
    return rc;
}
예제 #8
0
saj_returnCode
saj_timeCopyOut(
    JNIEnv *env,
    gapi_time_t *src,
    jobject *dst)
{
    assert(src);
    assert(dst);

    if (*dst == NULL) {
	   *dst = (*env)->NewObject (env, GET_CACHED(time_t_class),
                                        GET_CACHED(time_t_constructor_mid),
                                        src->sec, src->nanosec);
        saj_exceptionCheck(env);
	if (*dst == NULL) {
	    return SAJ_RETCODE_ERROR;
	}
    } else {
        /* set the nanosec and sec fields of the java object */
        (*env)->SetIntField(env, *dst, GET_CACHED(time_t_sec_fid), src->sec);
        saj_exceptionCheck(env);
        (*env)->SetIntField(env, *dst, GET_CACHED(time_t_nanosec_fid), src->nanosec);
        saj_exceptionCheck(env);
    }
    return SAJ_RETCODE_OK;
}
예제 #9
0
saj_returnCode
saj_stringSequenceCopyOut(
    JNIEnv *env,
    gapi_stringSeq src,
    jobjectArray *dst)
{
    jclass stringArrCls;
    jstring javaString;
    gapi_unsigned_long i;
    saj_returnCode rc;
    gapi_unsigned_long seqLength;

    assert(dst != NULL);

    javaString = NULL;
    rc = SAJ_RETCODE_OK;

    seqLength = src._length;
    stringArrCls = (*env)->FindClass(env, "java/lang/String");
    saj_exceptionCheck(env);

    assert(stringArrCls != NULL);

    *dst = (*env)->NewObjectArray(env, seqLength, stringArrCls, NULL);
    saj_exceptionCheck(env);


    /* get the c strings from the buffer */
    for (i = 0; i < seqLength && rc == SAJ_RETCODE_OK; i++)
    {
        javaString = (*env)->NewStringUTF(env, src._buffer[i]);
        saj_exceptionCheck(env);

        if (javaString != NULL)
        {
            /* store the string object in the string array */
            (*env)->SetObjectArrayElement(env, *dst, i, javaString);

            if ((*env)->ExceptionCheck(env) == JNI_TRUE)
            {
                rc = SAJ_RETCODE_ERROR;
            }
        }
        else
        {
            rc = SAJ_RETCODE_ERROR;
        }

        (*env)->DeleteLocalRef(env, javaString);
        saj_exceptionCheck(env);
    }

    return rc;
}
예제 #10
0
saj_returnCode
saj_EnumCopyIn(
    JNIEnv      *env,
    jobject     src,
    gapi_unsigned_long *dst)
{
    jclass enumClass;
    jfieldID enumValue_fid;
    jmethodID valueMethodId;
    saj_returnCode rc;
    jthrowable jexception = NULL;

    assert(dst != NULL);

    enumClass = NULL;
    enumValue_fid = NULL;
    rc = SAJ_RETCODE_OK;

    if(src != NULL)
    {
        enumClass = (*env)->GetObjectClass(env, src);
        saj_exceptionCheck(env);

        /* get __value fieldid from the enum class */
        enumValue_fid = (*env)->GetFieldID(env, enumClass, "__value", "I");
        jexception = (*env)->ExceptionOccurred(env);

        if (jexception)
        {
            /*  clear the exception */
            (*env)->ExceptionClear(env);
            valueMethodId = (*env)->GetMethodID(env, enumClass, "value", "()I");
            saj_exceptionCheck(env);
            if(valueMethodId != NULL)
            {
                *dst = (*env)->CallIntMethod(env, src, valueMethodId);
            } else
            {
                rc = SAJ_RETCODE_ERROR;
            }
        } else
        {
            *dst = (*env)->GetIntField(env, src, enumValue_fid);
            saj_exceptionCheck(env);
        }
    }

    return rc;

}
예제 #11
0
saj_returnCode saj_octetSequenceCopyOut(
    JNIEnv *env,
    gapi_octetSeq *src,
    jbyteArray *dst)
{
    saj_returnCode rc;

    assert(dst != NULL);

    rc = SAJ_RETCODE_ERROR;

    /* create a new java byte array */
    *dst = (*env)->NewByteArray(env, src->_length);
    saj_exceptionCheck(env);

    if (*dst != NULL)
    {
        (*env)->SetByteArrayRegion(
            env, *dst, 0, src->_length, (jbyte *)src->_buffer);

        if ((*env)->ExceptionCheck(env) == JNI_FALSE)
        {
            rc = SAJ_RETCODE_OK;
        }
    }

    return rc;
}
예제 #12
0
saj_returnCode
saj_statusCopyOutSampleRejectedStatus(
    JNIEnv *env,
    gapi_sampleRejectedStatus* status,
    jobject* jstatus)
{
    jclass cls;
    jmethodID mid;
    saj_returnCode rc;
    jobject jkind;
    
    cls = GET_CACHED(sampleRejectedStatus_class);
    mid = GET_CACHED(sampleRejectedStatus_constructor_mid);
    
    rc = saj_statusCopyOutSampleRejectedStatusKind(env, status->last_reason, 
                                                                    &jkind);
    if(rc == SAJ_RETCODE_OK){
        *jstatus = (*env)->NewObject(env, cls, mid, 
                                            (jint)status->total_count, 
                                            (jint)status->total_count_change,
                                            jkind,
                                            (jlong)status->last_instance_handle);
        saj_exceptionCheck(env);
    }
    return rc;
}
예제 #13
0
saj_returnCode
saj_LookupExistingConditionSeq(
    JNIEnv *env,
    gapi_conditionSeq *src,
    jobjectArray *dst)
{
    jclass classId;
    saj_returnCode rc;

    assert(dst != NULL);

    classId = NULL;
    rc = SAJ_RETCODE_ERROR;

    /* find the class id of the sequence class */
    classId = (*env)->FindClass(env, "DDS/Condition");
    saj_exceptionCheck(env);

    assert(classId != NULL);

    rc = saj_gapiObjectBufferCopyOut(
        env, classId, src->_length, src->_buffer, dst);

    return rc;
}
예제 #14
0
saj_returnCode
saj_timeCopyIn(
    JNIEnv *env,
    jobject src,
    gapi_time_t *dst)
{
    assert (src);
    assert (dst);

    dst->sec = (*env)->GetIntField(env, src, GET_CACHED(time_t_sec_fid));
    saj_exceptionCheck(env);
    dst->nanosec = (*env)->GetIntField(env, src, GET_CACHED(time_t_nanosec_fid));
    saj_exceptionCheck(env);

    return SAJ_RETCODE_OK;
}
예제 #15
0
saj_returnCode
saj_statusCopyOutRequestedIncompatibleQosStatus(
    JNIEnv *env,
    gapi_requestedIncompatibleQosStatus* status,
    jobject* jstatus)
{
    jclass cls;
    jmethodID mid;
    jobjectArray jqosCount;
    saj_returnCode rc;
    
    cls = GET_CACHED(requestedIncompatibleQosStatus_class);
    mid = GET_CACHED(requestedIncompatibleQosStatus_constructor_mid);
    rc = saj_statusCopyOutQosPolicyCountSeq(env, &status->policies, &jqosCount);
    
    if(rc == SAJ_RETCODE_OK){
        *jstatus = (*env)->NewObject(env, cls, mid, 
                                            (jint)status->total_count, 
                                            (jint)status->total_count_change,
                                            (jint)status->last_policy_id,
                                            jqosCount);
        saj_exceptionCheck(env);
    }
    return rc;
}
예제 #16
0
saj_returnCode
saj_LookupExistingDataReaderSeq(
    JNIEnv *env,
    gapi_dataReaderSeq *src,
    jobjectArray *dst)
{
    jclass classId;
    saj_returnCode rc;

    assert(dst != NULL);

    classId = NULL;
    rc = SAJ_RETCODE_ERROR;

    /* find the class id of the sequence class */
    classId = (*env)->FindClass(env, "org/opensplice/dds/dcps/DataReaderImpl");
    saj_exceptionCheck(env);

    assert(classId != NULL);

    rc = saj_gapiObjectBufferCopyOut(
        env, classId, src->_length, src->_buffer, dst);

    return rc;
}
예제 #17
0
saj_returnCode saj_builtinTopicKeyCopyOut(
    JNIEnv *env,
    gapi_builtinTopicKey_t *src,
    jintArray *dst)
{
    saj_returnCode rc;

    assert(dst != NULL);

    rc = SAJ_RETCODE_ERROR;

    /* create a new java byte array */
    *dst = (*env)->NewIntArray(env, 3);
    saj_exceptionCheck(env);

    if (*dst != NULL)
    {
        (*env)->SetIntArrayRegion(
            env, *dst, 0, 3, (jint *)src);

        if ((*env)->ExceptionCheck(env) == JNI_FALSE)
        {
            rc = SAJ_RETCODE_OK;
        }
    }

    return rc;
}
예제 #18
0
saj_returnCode saj_octetSequenceCopyIn(
    JNIEnv *env,
    jbyteArray jArray,
    gapi_octetSeq *out)
{
    jsize arrayLength;
    jbyte *vmManagedByteArray;
    saj_returnCode rc;

    assert(out != NULL);

    rc = SAJ_RETCODE_OK;

    if (jArray != NULL)
    {
        arrayLength = (*env)->GetArrayLength(env, jArray);
        saj_exceptionCheck(env);

        out->_maximum = arrayLength;
        out->_length = arrayLength;

        /* allocate a buffer of the right size */
        out->_buffer = gapi_octetSeq_allocbuf(arrayLength);
        out->_release = FALSE;

        vmManagedByteArray =
            (*env)->GetPrimitiveArrayCritical(env, jArray, NULL);

        if(vmManagedByteArray != NULL){
            memcpy(out->_buffer, vmManagedByteArray, arrayLength);

            /* don't copy the content of vmManagedByteArray to jArray */
            (*env)->ReleasePrimitiveArrayCritical(
                env, jArray, vmManagedByteArray, JNI_ABORT);
            saj_exceptionCheck(env);
        }
        else
        {
            rc = SAJ_RETCODE_ERROR;
        }
    }
    return rc;
}
예제 #19
0
saj_returnCode
saj_EnumCopyOut(
    JNIEnv              *env,
    const char          *classname,
    gapi_unsigned_long  src,
    jobject             *dst)
{
    jclass enumClassId;
    jmethodID from_intMethodId;
    saj_returnCode rc;
    char methodString[255];

    assert(dst != NULL && classname != NULL);
    assert(strlen(classname) < 249);

    enumClassId = NULL;
    from_intMethodId = NULL;
    rc = SAJ_RETCODE_ERROR;

    /* construct a method signature */
    snprintf(methodString, 255, "(I)L%s;", classname);

    enumClassId = (*env)->FindClass(env, classname);
    saj_exceptionCheck(env);

    if (enumClassId != NULL){
        from_intMethodId = (*env)->GetStaticMethodID(
            env, enumClassId, "from_int", methodString);
        saj_exceptionCheck(env);

        if (from_intMethodId != NULL){
            *dst = (*env)->CallStaticObjectMethod(
                env, enumClassId, from_intMethodId, src);
            saj_exceptionCheck(env);

            if(*dst != NULL){
                rc = SAJ_RETCODE_OK;
            }
        }
    }

    return rc;
}
예제 #20
0
void
saj_listenerDataFree(
    JNIEnv* env,
    saj_listenerData ld)
{
    if(ld != NULL) {
        (*env)->DeleteGlobalRef(env, ld->jlistener);
        saj_exceptionCheck(env);
        os_free(ld);
    }
}
예제 #21
0
saj_returnCode
saj_durationCopyIn(
    JNIEnv *env,
    jobject javaDuration,
    gapi_duration_t *out)
{
    saj_returnCode rc;

    assert(out != NULL);

    rc = SAJ_RETCODE_OK;

    if(javaDuration != NULL){
        out->sec = (*env)->GetIntField(env, javaDuration, GET_CACHED(duration_t_sec_fid));
        saj_exceptionCheck(env);
        out->nanosec = (*env)->GetIntField(env, javaDuration, GET_CACHED(duration_t_nanosec_fid));
        saj_exceptionCheck(env);
    }

    return rc;
}
예제 #22
0
void
saj_destroy_weak_user_data(
    JNIEnv *env,
    saj_userData ud)
{
    assert(env != NULL);

    if(ud != NULL){
        (*env)->DeleteWeakGlobalRef(env, ud->saj_object);
        saj_exceptionCheck(env);
        os_free(ud);
    }
}
예제 #23
0
void
saj_write_gapi_address(
    JNIEnv *env,
	jobject java_object,
	PA_ADDRCAST address)
{
    saj_returnCode rc;

    if(java_object != NULL){
        rc = checkJavaObject(env, java_object);

        if( rc == SAJ_RETCODE_OK){
            if (GET_CACHED(sajSuperClassGapiPeer_fid) == NULL) {
                SET_CACHED(sajSuperClassGapiPeer_fid, (*env)->GetFieldID(env, GET_CACHED(gapiSuperClass_class),
    				       "gapiPeer",
    				       "J"));
                saj_exceptionCheck(env);
            }
        	/* write value to java object */
        	(*env)->SetLongField(env, java_object, GET_CACHED(sajSuperClassGapiPeer_fid), address);
            saj_exceptionCheck(env);
        }
    }
}
예제 #24
0
saj_listenerData
saj_listenerDataNew(
    JNIEnv* env,
    jobject jlistener)
{
    saj_listenerData ld;

    ld = NULL;

    if(jlistener != NULL) {
        ld = saj_listenerData(os_malloc(C_SIZEOF(saj_listenerData)));
        ld->jlistener = (*env)->NewGlobalRef(env, jlistener);
        saj_exceptionCheck(env);
    }
    return ld;
}
예제 #25
0
saj_returnCode
saj_gapiObjectBufferCopyOut(
    JNIEnv *env,
    jclass classId,
    gapi_unsigned_long seqLength,
    gapi_object *src,
    jobjectArray *dst)
{
    jobject object;
    gapi_unsigned_long i;
    saj_returnCode rc;

    assert(dst != NULL);
    assert((seqLength == 0) || (src != NULL));

    object = NULL;
    rc = SAJ_RETCODE_ERROR;

    if(classId != NULL)
    {
        /* create a new object array */
        *dst = (*env)->NewObjectArray(env, seqLength, classId, NULL);
        saj_exceptionCheck(env);

        if (*dst != NULL)
        {
            rc = SAJ_RETCODE_OK;
            for (i = 0; i < seqLength && rc == SAJ_RETCODE_OK; i++)
            {
                /* find the reference to the already existing java object */
                object = saj_read_java_address((gapi_object)src[i]);

                assert(object != NULL);

                (*env)->SetObjectArrayElement(env, *dst, i, object);

                if ((*env)->ExceptionCheck(env) == JNI_TRUE)
                {
                    /* ArrayIndexOutOfBoundsException or ArrayStoreException */
                    rc = SAJ_RETCODE_ERROR;
                }
            }
        }
    }

    return rc;
}
예제 #26
0
saj_returnCode
saj_statusCopyOutSampleRejectedStatusKind(
    JNIEnv *env,
    gapi_sampleRejectedStatusKind kind,
    jobject *jkind)
{
    jclass cls;
    jmethodID mid;
    
    cls = GET_CACHED(sampleRejectedStatusKind_class);
    mid = GET_CACHED(sampleRejectedStatusKind_fromInt_mid);
    
    *jkind = (*env)->CallStaticObjectMethod(env, cls, mid, (jint)kind);
    saj_exceptionCheck(env);
    
    return SAJ_RETCODE_OK;
}
예제 #27
0
saj_returnCode
saj_statusCopyOutInconsistentTopicStatus(
    JNIEnv *env,
    gapi_inconsistentTopicStatus* status,
    jobject* jstatus)
{
    jclass cls;
    jmethodID mid;
    
    cls = GET_CACHED(inconsistentTopicStatus_class);
    mid = GET_CACHED(inconsistentTopicStatus_constructor_mid);
    
    *jstatus = (*env)->NewObject(env, cls, mid, 
                                            (jint)status->total_count, 
                                            (jint)status->total_count_change);
    saj_exceptionCheck(env);
    
    return SAJ_RETCODE_OK;
}
예제 #28
0
void
saj_write_weak_java_address(
    JNIEnv *env,
    gapi_object gapi_obj,
    jobject java_object)
{
    saj_userData ud;

    assert(env != NULL);
    assert(gapi_obj != NULL);
    assert(java_object != NULL);

    ud = os_malloc(C_SIZEOF(saj_userData));
    ud->saj_object = (*env)->NewWeakGlobalRef(env, java_object);
    saj_exceptionCheck(env);
    ud->listenerData = NULL;
    ud->statusConditionUserData = NULL;
    gapi_object_set_user_data(gapi_obj, (void*)ud,NULL,NULL);
}
예제 #29
0
saj_returnCode
saj_statusCopyOutQosPolicyCount(
    JNIEnv *env,
    gapi_qosPolicyCount* status,
    jobject* jstatus)
{
    jclass cls;
    jmethodID mid;
    
    cls = GET_CACHED(qosPolicyCount_class);
    mid = GET_CACHED(qosPolicyCount_constructor_mid);
    
    *jstatus = (*env)->NewObject(env, cls, mid, 
                                            (jint)status->policy_id, 
                                            (jint)status->count);
    saj_exceptionCheck(env);
    
    return SAJ_RETCODE_OK;
}
예제 #30
0
void
saj_destroy_user_data(
    JNIEnv *env,
    saj_userData ud)
{
    /*
     * Because of multithread issues the supplied data might be NULL.
     */
    if(ud != NULL){
        if(ud->listenerData != NULL){
            saj_listenerDataFree(env, ud->listenerData);
        }
        if(ud->statusConditionUserData != NULL){
            saj_destroy_user_data(env, ud->statusConditionUserData);
        }
        (*env)->DeleteGlobalRef(env, ud->saj_object);
        saj_exceptionCheck(env);
    }
}