/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_TAG "VideoEditorJava" #include <VideoEditorClasses.h> #include <VideoEditorJava.h> #include <VideoEditorLogging.h> #include <VideoEditorOsal.h> extern "C" { #include <M4OSA_CharStar.h> }; void videoEditJava_checkAndThrowIllegalArgumentExceptionFunc( bool* pResult, JNIEnv* pEnv, bool condition, const char* pMessage, const char* pFile, int lineNo) { // Check if the previous action succeeded. if (*pResult) { // Check if the condition is true. if (condition) { // Log the exception. VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA",\ "videoEditJava_checkAndThrowIllegalArgumentException, %s (%s:%d)", pMessage, pFile, lineNo); // Reset the result flag. (*pResult) = false; // Throw an exception. jniThrowException(pEnv, "java/lang/IllegalArgumentException", pMessage); } } } void videoEditJava_checkAndThrowRuntimeExceptionFunc( bool* pResult, JNIEnv* pEnv, bool condition, M4OSA_ERR result, const char* pFile, int lineNo ) { const char* pMessage = NULL; // Check if the previous action succeeded. if (*pResult) { // Check if the condition is true. if (condition) { // Get the error string. pMessage = videoEditJava_getErrorName(result); // Log the exception. VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA", "videoEditJava_checkAndThrowRuntimeException, %s (%s:%d)", pMessage, pFile, lineNo); // Reset the result flag. (*pResult) = false; // Throw an exception. jniThrowException(pEnv, "java/lang/RuntimeException", pMessage); } } } void videoEditJava_checkAndThrowIllegalStateExceptionFunc( bool* pResult, JNIEnv* pEnv, bool condition, const char* pMessage, const char* pFile, int lineNo ) { // Check if the previous action succeeded. if (*pResult) { // Check if the condition is true. if (condition) { // Log the exception. VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA", "videoEditJava_checkAndThrowIllegalStateException, %s (%s:%d)", pMessage, pFile, lineNo); // Reset the result flag. (*pResult) = false; // Throw an exception. jniThrowException(pEnv, "java/lang/IllegalStateException", pMessage); } } } void videoEditJava_getClass( bool* pResult, JNIEnv* pEnv, const char* pName, jclass* pClazz) { // Only look for the class if locating the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getClass(%s)", pName); // Look up the class. jclass clazz = pEnv->FindClass(pName); // Clear any resulting exceptions. pEnv->ExceptionClear(); // Check if the class could be located. if (NULL != clazz) { // Return the class. (*pClazz) = clazz; } else { // Reset the result flag. (*pResult) = false; // Log the error. VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA", "videoEditJava_getClass, error: unable to locate class %s", pName); // Throw an exception. jniThrowException(pEnv, "java/lang/ClassNotFoundException", "unable to locate class"); } } } void videoEditJava_getMethodId( bool* pResult, JNIEnv* pEnv, jclass clazz, const char* pName, const char* pType, jmethodID* pMethodId) { // Only look for the class if locating the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getMethodId(%s,%s)", pName, pType); // Look up the method id. jmethodID methodId = pEnv->GetMethodID(clazz, pName, pType); // Clear any resulting exceptions. pEnv->ExceptionClear(); // Check if the method could be located. if (NULL != methodId) { // Return the method id. (*pMethodId) = methodId; } else { // Reset the result flag. (*pResult) = false; // Log the error. VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA", "videoEditJava_getMethodId, error: unable to locate method %s with type %s", pName, pType); // Throw an exception. jniThrowException(pEnv, "java/lang/NoSuchMethodException", "unable to locate method"); } } } void videoEditJava_getFieldId( bool* pResult, JNIEnv* pEnv, jclass clazz, const char* pName, const char* pType, jfieldID* pFieldId) { // Only look for the class if locating the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getFieldId(%s,%s)", pName, pType); // Look up the field id. jfieldID fieldId = pEnv->GetFieldID(clazz, pName, pType); // Clear any resulting exceptions. pEnv->ExceptionClear(); // Check if the field could be located. if (NULL != fieldId) { // Return the field id. (*pFieldId) = fieldId; } else { // Reset the result flag. (*pResult) = false; // Log the error. VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA", "videoEditJava_getFieldId, error: unable to locate field %s with type %s", pName, pType); // Throw an exception. jniThrowException(pEnv, "java/lang/NoSuchFieldException", "unable to locate field"); } } } void videoEditJava_getObject( bool* pResult, JNIEnv* pEnv, jobject object, jfieldID objectFieldId, jobject* pObject) { // Only retrieve the array object and size if the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getObject()"); // Retrieve the object. (*pObject) = pEnv->GetObjectField(object, objectFieldId); // Clear any resulting exceptions. pEnv->ExceptionClear(); } } void videoEditJava_getArray( bool* pResult, JNIEnv* pEnv, jobject object, jfieldID arrayFieldId, jobjectArray* pArray, jsize* pArraySize) { // Only retrieve the array object and size if the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getArray()"); // Retrieve the array object. jobjectArray array = (jobjectArray)pEnv->GetObjectField(object, arrayFieldId); jsize arraySize = 0; // Clear any resulting exceptions. pEnv->ExceptionClear(); // Check if the array could be retrieved. if (NULL != array) { // Retrieve the array size. arraySize = pEnv->GetArrayLength(array); } // Return the array and its size. (*pArray) = array; (*pArraySize) = arraySize; } } void* videoEditJava_getString( bool* pResult, JNIEnv* pEnv, jobject object, jfieldID stringFieldId, M4OSA_UInt32* pLength) { void* pString = M4OSA_NULL; jstring string = NULL; M4OSA_UInt32 length = 0; M4OSA_Char* pLocal = M4OSA_NULL; M4OSA_ERR result = M4NO_ERROR; // Check if the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getString()"); // Check if an object containing a string was specified. if (NULL != stringFieldId) { // Retrieve the string object. string = (jstring)pEnv->GetObjectField(object, stringFieldId); // Clear any resulting exceptions. pEnv->ExceptionClear(); } else { // The string itself was specified. string = (jstring)object; } // Check if the string could be retrieved. if (NULL != string) { // Get a local copy of the string. pLocal = (M4OSA_Char*)pEnv->GetStringUTFChars(string, M4OSA_NULL); if (M4OSA_NULL != pLocal) { // Determine the length of the path // (add one extra character for the zero terminator). length = strlen((const char *)pLocal) + 1; // Allocate memory for the string. pString = videoEditOsal_alloc(pResult, pEnv, length, "String"); if (*pResult) { // Copy the string. result = M4OSA_chrNCopy((M4OSA_Char*)pString, pLocal, length); // Check if the copy succeeded. videoEditJava_checkAndThrowRuntimeException(pResult, pEnv, (M4NO_ERROR != result), result); // Check if the string could not be copied. if (!(*pResult)) { // Free the allocated memory. videoEditOsal_free(pString); pString = M4OSA_NULL; } } // Release the local copy of the string. pEnv->ReleaseStringUTFChars(string, (const char *)pLocal); } } // Check if the string was empty or could be copied. if (*pResult) { // Check if the length was requested. if (M4OSA_NULL != pLength) { // Return the length. (*pLength) = length; } } // Delete local references to avoid memory leaks pEnv->DeleteLocalRef(string); } // Return the string. return(pString); } void videoEditJava_getStaticIntField( bool* pResult, JNIEnv* pEnv, jclass clazz, const char* pName, int* pValue) { // Only look for the class if locating the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getStaticIntField(%s)", pName); // Look up the field id. jfieldID fieldId = pEnv->GetStaticFieldID(clazz, pName, "I"); // Clear any resulting exceptions. pEnv->ExceptionClear(); // Check if the field could be located. if (NULL != fieldId) { // Retrieve the field value. (*pValue) = pEnv->GetStaticIntField(clazz, fieldId); // Log the value. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getStaticIntField, %s = %d", pName, (*pValue)); } else { // Reset the result flag. (*pResult) = false; // Log the error. VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA", "videoEditJava_getStaticIntField, error: unable to locate field %s", pName); // Throw an exception. jniThrowException(pEnv, "java/lang/NoSuchFieldException", "unable to locate static field"); } } } void videoEditJava_initConstantClass( bool* pResult, JNIEnv* pEnv, VideoEditJava_ConstantsClass* pClass) { bool gotten = true; jclass clazz = NULL; int index = 0; // Check if the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_initConstantClass(%s)", pClass->pName); // Only initialize the class once. if (!pClass->initialized) { // Look up the class. videoEditJava_getClass(pResult, pEnv, pClass->pName, &clazz); // Loop over the constants. for (index = 0; index < pClass->count; index++) { // Look up the constant. videoEditJava_getStaticIntField(pResult, pEnv, clazz, pClass->pConstants[index].pName, &pClass->pConstants[index].java); } // Check if all constants could be located. if (*pResult) { // Set the initialized flag. pClass->initialized = true; } } } } const char* videoEditJava_getConstantClassName( const VideoEditJava_ConstantsClass* pClass, int value, VideoEditJava_UnknownConstant unknown) { const char* pName = M4OSA_NULL; int index = 0; // Loop over the list with constants. for (index = 0; ((M4OSA_NULL == pName) && (index < pClass->count)); index++) { // Check if the specified value matches the c value of the constant. if (value == pClass->pConstants[index].c) { // Set the name. pName = pClass->pConstants[index].pName; } } // Check if no constant was found. if (M4OSA_NULL == pName) { // Check if a function was specified to handle this case. if (M4OSA_NULL != unknown) { // Pass the constant to the specified unknown function. pName = unknown(value); } else { // Set the description to a default value. pName = "<unknown>"; } } // Return the result. return(pName); } const char* videoEditJava_getConstantClassString( const VideoEditJava_ConstantsClass* pClass, int value, VideoEditJava_UnknownConstant unknown) { const char* pString = M4OSA_NULL; int index = 0; // Loop over the list with constants. for (index = 0; ((M4OSA_NULL == pString) && (index < pClass->count)); index++) { // Check if the specified value matches the c value of the constant. if (value == pClass->pConstants[index].c) { // Set the description. pString = pClass->pConstants[index].pDescription; } } // Check if no constant was found. if (M4OSA_NULL == pString) { // Check if a function was specified to handle this case. if (M4OSA_NULL != unknown) { // Pass the constant to the specified unknown function. pString = unknown(value); } else { // Set the description to a default value. pString = "<unknown>"; } } // Return the result. return(pString); } int videoEditJava_getConstantClassJavaToC( bool* pResult, const VideoEditJava_ConstantsClass* pClass, int value) { bool gotten = false; int index = 0; // Check if the previous action succeeded. if (*pResult) { // Loop over the list with constants. for (index = 0; ((!gotten) && (index < pClass->count)); index++) { // Check if the specified value matches the java value of the constant. if (value == pClass->pConstants[index].java) { // Set the value to the c value. value = pClass->pConstants[index].c; // Set the gotten flag. gotten = true; } } // Check if the value was not found. if (!gotten) { (*pResult) = false; } } // Return the translated value. return(value); } int videoEditJava_getConstantClassJavaToC( bool* pResult, const VideoEditJava_ConstantsClass* pClass, int value, int unknown) { bool gotten = false; int index = 0; // Check if the previous action succeeded. if (*pResult) { // Loop over the list with constants. for (index = 0; ((!gotten) && (index < pClass->count)); index++) { // Check if the specified value matches the java value of the constant. if (value == pClass->pConstants[index].java) { // Set the value to the c value. value = pClass->pConstants[index].c; // Set the gotten flag. gotten = true; } } // If the constant was not found, look for the specified unknown. if (!gotten) { // Set the value to the c value. value = unknown; } } // Return the translated value. return(value); } int videoEditJava_getConstantClassCToJava( const VideoEditJava_ConstantsClass* pClass, int value) { bool gotten = false; int index = 0; // Loop over the list with constants. for (index = 0; ((!gotten) && (index < pClass->count)); index++) { // Check if the specified value matches the c value of the constant. if (value == pClass->pConstants[index].c) { // Set the value to the java value. value = pClass->pConstants[index].java; // Set the gotten flag. gotten = true; } } // Return the translated value. return(value); } int videoEditJava_getConstantClassCToJava( const VideoEditJava_ConstantsClass* pClass, int value, int unknown) { bool gotten = false; int index = 0; // Loop over the list with constants. for (index = 0; ((!gotten) && (index < pClass->count)); index++) { // Check if the specified value matches the c value of the constant. if (value == pClass->pConstants[index].c) { // Set the value to the java value. value = pClass->pConstants[index].java; // Set the gotten flag. gotten = true; } } // If the constant was not found, look for the specified unknown. if (!gotten) { // Loop over the list with constants. for (index = 0; ((!gotten) && (index < pClass->count)); index++) { // Check if the specified value matches the java value of the constant. if (unknown == pClass->pConstants[index].c) { // Set the value to the c value. value = pClass->pConstants[index].java; // Set the gotten flag. gotten = true; } } } // Return the translated value. return(value); } void videoEditJava_initFieldClass( bool* pResult, JNIEnv* pEnv, VideoEditJava_FieldsClass* pClass) { bool gotten = true; jclass clazz = NULL; int index = 0; // Check if the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_initFieldClass(%s)", pClass->pName); // Only initialize the class once. if (!pClass->initialized) { // Look up the class. videoEditJava_getClass(pResult, pEnv, pClass->pName, &clazz); // Loop over the fields. for (index = 0; index < pClass->count; index++) { // Look up the field id. videoEditJava_getFieldId( pResult, pEnv, clazz, pClass->pFields[index].pName, pClass->pFields[index].pType, &pClass->pFields[index].fieldId); } // Check if all fields could be located. if (*pResult) { // Set the initialized flag. pClass->initialized = true; } } } } void videoEditJava_fieldClassClass( bool* pResult, JNIEnv* pEnv, const VideoEditJava_FieldsClass* pClass, jclass* pClazz) { // Check if the previous action succeeded. if (*pResult) { // Check if the class is initialized. videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, (!pClass->initialized), "field class not initialized"); // Get the class. videoEditJava_getClass(pResult, pEnv, pClass->pName, pClazz); } } void videoEditJava_fieldClassFieldIds( bool* pResult, JNIEnv* pEnv, const VideoEditJava_FieldsClass* pClass, int count, VideoEditJava_FieldIds* pIds) { int index = 0; // Check if the previous action succeeded. if (*pResult) { // Check if the class is initialized. videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, (!pClass->initialized), "field class not initialized"); // Check if the number of fields matches. videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, (pClass->count != count), "field class type mismatch"); // Check if the class and object are valid. if (*pResult) { // Loop over the class fields. for (index = 0; index < count; index++) { // Copy the field ids. pIds->fieldIds[index] = pClass->pFields[index].fieldId; } } } } void videoEditJava_initMethodClass( bool* pResult, JNIEnv* pEnv, VideoEditJava_MethodsClass* pClass) { bool gotten = true; jclass clazz = NULL; int index = 0; // Check if the previous action succeeded. if (*pResult) { // Log the function call. VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_initMethodClass(%s)", pClass->pName); // Only initialize the class once. if (!pClass->initialized) { // Look up the class. videoEditJava_getClass(pResult, pEnv, pClass->pName, &clazz); // Loop over the methods. for (index = 0; index < pClass->count; index++) { // Look up the method id. videoEditJava_getMethodId( pResult, pEnv, clazz, pClass->pMethods[index].pName, pClass->pMethods[index].pType, &pClass->pMethods[index].methodId); } // Check if all methods could be located. if (*pResult) { // Set the initialized flag. pClass->initialized = true; } } } } void videoEditJava_methodClassMethodIds( bool* pResult, JNIEnv* pEnv, const VideoEditJava_MethodsClass* pClass, int count, VideoEditJava_MethodIds* pIds) { int index = 0; // Check if the previous action succeeded. if (*pResult) { // Check if the class is initialized. videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, (!pClass->initialized), "method class not initialized"); // Check if the number of methods matches. videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,\ (pClass->count != count), "method class type mismatch"); // Check if the class and object are valid. if (*pResult) { // Loop over the class methods. for (index = 0; index < count; index++) { // Copy the method ids. pIds->methodIds[index] = pClass->pMethods[index].methodId; } } } }