static jint android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, jint sessionId, jintArray jId) { ALOGV("android_media_visualizer_native_setup"); visualizerJniStorage* lpJniStorage = NULL; int lStatus = VISUALIZER_ERROR_NO_MEMORY; Visualizer* lpVisualizer = NULL; jint* nId = NULL; lpJniStorage = new visualizerJniStorage(); if (lpJniStorage == NULL) { ALOGE("setup: Error creating JNI Storage"); goto setup_failure; } lpJniStorage->mCallbackData.visualizer_class = (jclass)env->NewGlobalRef(fields.clazzEffect); // we use a weak reference so the Visualizer object can be garbage collected. lpJniStorage->mCallbackData.visualizer_ref = env->NewGlobalRef(weak_this); ALOGV("setup: lpJniStorage: %p visualizer_ref %p visualizer_class %p, &mCallbackData %p", lpJniStorage, lpJniStorage->mCallbackData.visualizer_ref, lpJniStorage->mCallbackData.visualizer_class, &lpJniStorage->mCallbackData); if (jId == NULL) { ALOGE("setup: NULL java array for id pointer"); lStatus = VISUALIZER_ERROR_BAD_VALUE; goto setup_failure; } // create the native Visualizer object lpVisualizer = new Visualizer(0, android_media_visualizer_effect_callback, lpJniStorage, sessionId); if (lpVisualizer == NULL) { ALOGE("Error creating Visualizer"); goto setup_failure; } lStatus = translateError(lpVisualizer->initCheck()); if (lStatus != VISUALIZER_SUCCESS && lStatus != VISUALIZER_ERROR_ALREADY_EXISTS) { ALOGE("Visualizer initCheck failed %d", lStatus); goto setup_failure; } nId = (jint *) env->GetPrimitiveArrayCritical(jId, NULL); if (nId == NULL) { ALOGE("setup: Error retrieving id pointer"); lStatus = VISUALIZER_ERROR_BAD_VALUE; goto setup_failure; } nId[0] = lpVisualizer->id(); env->ReleasePrimitiveArrayCritical(jId, nId, 0); nId = NULL; env->SetLongField(thiz, fields.fidNativeVisualizer, (jlong)lpVisualizer); env->SetLongField(thiz, fields.fidJniData, (jlong)lpJniStorage); return VISUALIZER_SUCCESS; // failures: setup_failure: if (nId != NULL) { env->ReleasePrimitiveArrayCritical(jId, nId, 0); } if (lpVisualizer) { delete lpVisualizer; } env->SetLongField(thiz, fields.fidNativeVisualizer, 0); if (lpJniStorage) { delete lpJniStorage; } env->SetLongField(thiz, fields.fidJniData, 0); return (jint) lStatus; }