static jint android_media_AudioEffect_native_command(JNIEnv *env, jobject thiz, jint cmdCode, jint cmdSize, jbyteArray jCmdData, jint replySize, jbyteArray jReplyData) { jbyte* pCmdData = NULL; jbyte* pReplyData = NULL; jint lStatus = AUDIOEFFECT_ERROR_BAD_VALUE; // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for setParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; } if ((cmdSize != 0 && jCmdData == NULL) || (replySize != 0 && jReplyData == NULL)) { return AUDIOEFFECT_ERROR_BAD_VALUE; } // get the pointer for the command from the java array if (cmdSize != 0) { pCmdData = (jbyte *) env->GetPrimitiveArrayCritical(jCmdData, NULL); if (pCmdData == NULL) { ALOGE("setParameter: Error retrieving command pointer"); goto command_Exit; } } // get the pointer for the reply from the java array if (replySize != 0 && jReplyData != NULL) { pReplyData = (jbyte *) env->GetPrimitiveArrayCritical(jReplyData, NULL); if (pReplyData == NULL) { ALOGE("setParameter: Error retrieving reply pointer"); goto command_Exit; } } lStatus = translateError(lpAudioEffect->command((uint32_t)cmdCode, (uint32_t)cmdSize, pCmdData, (uint32_t *)&replySize, pReplyData)); command_Exit: if (pCmdData != NULL) { env->ReleasePrimitiveArrayCritical(jCmdData, pCmdData, 0); } if (pReplyData != NULL) { env->ReleasePrimitiveArrayCritical(jReplyData, pReplyData, 0); } if (lStatus == NO_ERROR) { return replySize; } return lStatus; }