1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "VideoEditorJava"
18
19#include <VideoEditorClasses.h>
20#include <VideoEditorJava.h>
21#include <VideoEditorLogging.h>
22#include <VideoEditorOsal.h>
23
24extern "C" {
25#include <M4OSA_CharStar.h>
26};
27
28
29void
30videoEditJava_checkAndThrowIllegalArgumentExceptionFunc(
31                bool*                               pResult,
32                JNIEnv*                             pEnv,
33                bool                                condition,
34                const char*                         pMessage,
35                const char*                         pFile,
36                int                                 lineNo)
37{
38    // Check if the previous action succeeded.
39    if (*pResult)
40    {
41        // Check if the condition is true.
42        if (condition)
43        {
44            // Log the exception.
45            VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA",\
46                    "videoEditJava_checkAndThrowIllegalArgumentException, %s (%s:%d)",
47                    pMessage, pFile, lineNo);
48
49            // Reset the result flag.
50            (*pResult) = false;
51
52            // Throw an exception.
53            jniThrowException(pEnv, "java/lang/IllegalArgumentException", pMessage);
54        }
55    }
56}
57
58void
59videoEditJava_checkAndThrowRuntimeExceptionFunc(
60                bool*                               pResult,
61                JNIEnv*                             pEnv,
62                bool                                condition,
63                M4OSA_ERR                           result,
64                const char*                         pFile,
65                int                                 lineNo
66                )
67{
68    const char* pMessage = NULL;
69
70    // Check if the previous action succeeded.
71    if (*pResult)
72    {
73        // Check if the condition is true.
74        if (condition)
75        {
76            // Get the error string.
77            pMessage = videoEditJava_getErrorName(result);
78
79            // Log the exception.
80            VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA",
81                    "videoEditJava_checkAndThrowRuntimeException, %s (%s:%d)",
82                    pMessage, pFile, lineNo);
83
84            // Reset the result flag.
85            (*pResult) = false;
86
87            // Throw an exception.
88            jniThrowException(pEnv, "java/lang/RuntimeException", pMessage);
89        }
90    }
91}
92
93void
94videoEditJava_checkAndThrowIllegalStateExceptionFunc(
95                bool*                               pResult,
96                JNIEnv*                             pEnv,
97                bool                                condition,
98                const char*                         pMessage,
99                const char*                         pFile,
100                int                                 lineNo
101                )
102{
103    // Check if the previous action succeeded.
104    if (*pResult)
105    {
106        // Check if the condition is true.
107        if (condition)
108        {
109            // Log the exception.
110            VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA",
111                    "videoEditJava_checkAndThrowIllegalStateException, %s (%s:%d)",
112                    pMessage, pFile, lineNo);
113
114            // Reset the result flag.
115            (*pResult) = false;
116
117            // Throw an exception.
118            jniThrowException(pEnv, "java/lang/IllegalStateException", pMessage);
119        }
120    }
121}
122
123void
124videoEditJava_getClass(
125                bool*                               pResult,
126                JNIEnv*                             pEnv,
127                const char*                         pName,
128                jclass*                             pClazz)
129{
130    // Only look for the class if locating the previous action succeeded.
131    if (*pResult)
132    {
133        // Log the function call.
134        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
135                "videoEditJava_getClass(%s)", pName);
136
137        // Look up the class.
138        jclass clazz = pEnv->FindClass(pName);
139
140        // Clear any resulting exceptions.
141        pEnv->ExceptionClear();
142
143        // Check if the class could be located.
144        if (NULL != clazz)
145        {
146            // Return the class.
147            (*pClazz) = clazz;
148        }
149        else
150        {
151            // Reset the result flag.
152            (*pResult) = false;
153
154            // Log the error.
155            VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA",
156                    "videoEditJava_getClass, error: unable to locate class %s", pName);
157
158            // Throw an exception.
159            jniThrowException(pEnv, "java/lang/ClassNotFoundException",
160                    "unable to locate class");
161        }
162    }
163}
164
165void
166videoEditJava_getMethodId(
167                bool*                               pResult,
168                JNIEnv*                             pEnv,
169                jclass                              clazz,
170                const char*                         pName,
171                const char*                         pType,
172                jmethodID*                          pMethodId)
173{
174    // Only look for the class if locating the previous action succeeded.
175    if (*pResult)
176    {
177        // Log the function call.
178        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
179                "videoEditJava_getMethodId(%s,%s)", pName, pType);
180
181        // Look up the method id.
182        jmethodID methodId = pEnv->GetMethodID(clazz, pName, pType);
183
184        // Clear any resulting exceptions.
185        pEnv->ExceptionClear();
186
187        // Check if the method could be located.
188        if (NULL != methodId)
189        {
190            // Return the method id.
191            (*pMethodId) = methodId;
192        }
193        else
194        {
195            // Reset the result flag.
196            (*pResult) = false;
197
198            // Log the error.
199            VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA",
200                    "videoEditJava_getMethodId, error: unable to locate method %s with type %s",
201                    pName, pType);
202
203            // Throw an exception.
204            jniThrowException(pEnv, "java/lang/NoSuchMethodException", "unable to locate method");
205        }
206    }
207}
208
209void
210videoEditJava_getFieldId(
211                bool*                               pResult,
212                JNIEnv*                             pEnv,
213                jclass                              clazz,
214                const char*                         pName,
215                const char*                         pType,
216                jfieldID*                           pFieldId)
217{
218    // Only look for the class if locating the previous action succeeded.
219    if (*pResult)
220    {
221        // Log the function call.
222        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
223                "videoEditJava_getFieldId(%s,%s)", pName, pType);
224
225        // Look up the field id.
226        jfieldID fieldId = pEnv->GetFieldID(clazz, pName, pType);
227
228        // Clear any resulting exceptions.
229        pEnv->ExceptionClear();
230
231        // Check if the field could be located.
232        if (NULL != fieldId)
233        {
234            // Return the field id.
235            (*pFieldId) = fieldId;
236        }
237        else
238        {
239            // Reset the result flag.
240            (*pResult) = false;
241
242            // Log the error.
243            VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA",
244                    "videoEditJava_getFieldId, error: unable to locate field %s with type %s",
245                    pName, pType);
246
247            // Throw an exception.
248            jniThrowException(pEnv, "java/lang/NoSuchFieldException", "unable to locate field");
249        }
250    }
251}
252
253void
254videoEditJava_getObject(
255                bool*                               pResult,
256                JNIEnv*                             pEnv,
257                jobject                             object,
258                jfieldID                            objectFieldId,
259                jobject*                            pObject)
260{
261    // Only retrieve the array object and size if the previous action succeeded.
262    if (*pResult)
263    {
264        // Log the function call.
265        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
266            "videoEditJava_getObject()");
267
268        // Retrieve the object.
269        (*pObject) = pEnv->GetObjectField(object, objectFieldId);
270
271        // Clear any resulting exceptions.
272        pEnv->ExceptionClear();
273    }
274}
275
276void
277videoEditJava_getArray(
278                bool*                               pResult,
279                JNIEnv*                             pEnv,
280                jobject                             object,
281                jfieldID                            arrayFieldId,
282                jobjectArray*                       pArray,
283                jsize*                              pArraySize)
284{
285    // Only retrieve the array object and size if the previous action succeeded.
286    if (*pResult)
287    {
288        // Log the function call.
289        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getArray()");
290
291        // Retrieve the array object.
292        jobjectArray array     = (jobjectArray)pEnv->GetObjectField(object, arrayFieldId);
293        jsize        arraySize = 0;
294
295        // Clear any resulting exceptions.
296        pEnv->ExceptionClear();
297
298        // Check if the array could be retrieved.
299        if (NULL != array)
300        {
301            // Retrieve the array size.
302            arraySize = pEnv->GetArrayLength(array);
303        }
304
305        // Return the array and its size.
306        (*pArray)     = array;
307        (*pArraySize) = arraySize;
308    }
309}
310
311void*
312videoEditJava_getString(
313                bool*                               pResult,
314                JNIEnv*                             pEnv,
315                jobject                             object,
316                jfieldID                            stringFieldId,
317                M4OSA_UInt32*                       pLength)
318{
319    void*        pString = M4OSA_NULL;
320    jstring      string  = NULL;
321    M4OSA_UInt32 length  = 0;
322    M4OSA_Char*  pLocal  = M4OSA_NULL;
323    M4OSA_ERR    result  = M4NO_ERROR;
324
325    // Check if the previous action succeeded.
326    if (*pResult)
327    {
328        // Log the function call.
329        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA", "videoEditJava_getString()");
330
331        // Check if an object containing a string was specified.
332        if (NULL != stringFieldId)
333        {
334            // Retrieve the string object.
335            string = (jstring)pEnv->GetObjectField(object, stringFieldId);
336
337            // Clear any resulting exceptions.
338            pEnv->ExceptionClear();
339        }
340        else
341        {
342            // The string itself was specified.
343            string = (jstring)object;
344        }
345
346        // Check if the string could be retrieved.
347        if (NULL != string)
348        {
349            // Get a local copy of the string.
350            pLocal = (M4OSA_Char*)pEnv->GetStringUTFChars(string, M4OSA_NULL);
351            if (M4OSA_NULL != pLocal)
352            {
353                // Determine the length of the path
354                // (add one extra character for the zero terminator).
355                length = strlen((const char *)pLocal) + 1;
356
357                // Allocate memory for the string.
358                pString = videoEditOsal_alloc(pResult, pEnv, length, "String");
359                if (*pResult)
360                {
361                    // Copy the string.
362                    result = M4OSA_chrNCopy((M4OSA_Char*)pString, pLocal, length);
363
364                    // Check if the copy succeeded.
365                    videoEditJava_checkAndThrowRuntimeException(pResult, pEnv,
366                     (M4NO_ERROR != result), result);
367
368                    // Check if the string could not be copied.
369                    if (!(*pResult))
370                    {
371                        // Free the allocated memory.
372                        videoEditOsal_free(pString);
373                        pString = M4OSA_NULL;
374                    }
375                }
376
377                // Release the local copy of the string.
378                pEnv->ReleaseStringUTFChars(string, (const char *)pLocal);
379            }
380        }
381
382        // Check if the string was empty or could be copied.
383        if (*pResult)
384        {
385            // Check if the length was requested.
386            if (M4OSA_NULL != pLength)
387            {
388                // Return the length.
389                (*pLength) = length;
390            }
391        }
392
393        // Delete local references to avoid memory leaks
394        pEnv->DeleteLocalRef(string);
395    }
396
397    // Return the string.
398    return(pString);
399}
400
401void
402videoEditJava_getStaticIntField(
403                bool*                               pResult,
404                JNIEnv*                             pEnv,
405                jclass                              clazz,
406                const char*                         pName,
407                int*                                pValue)
408{
409    // Only look for the class if locating the previous action succeeded.
410    if (*pResult)
411    {
412        // Log the function call.
413        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
414                "videoEditJava_getStaticIntField(%s)", pName);
415
416        // Look up the field id.
417        jfieldID fieldId = pEnv->GetStaticFieldID(clazz, pName, "I");
418
419        // Clear any resulting exceptions.
420        pEnv->ExceptionClear();
421
422        // Check if the field could be located.
423        if (NULL != fieldId)
424        {
425            // Retrieve the field value.
426            (*pValue) = pEnv->GetStaticIntField(clazz, fieldId);
427
428            // Log the value.
429            VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
430                    "videoEditJava_getStaticIntField, %s = %d", pName, (*pValue));
431        }
432        else
433        {
434            // Reset the result flag.
435            (*pResult) = false;
436
437            // Log the error.
438            VIDEOEDIT_LOG_EXCEPTION(ANDROID_LOG_ERROR, "VIDEO_EDITOR_JAVA",
439                    "videoEditJava_getStaticIntField, error: unable to locate field %s", pName);
440
441            // Throw an exception.
442            jniThrowException(pEnv, "java/lang/NoSuchFieldException",
443                    "unable to locate static field");
444        }
445    }
446}
447
448void
449videoEditJava_initConstantClass(
450                bool*                               pResult,
451                JNIEnv*                             pEnv,
452                VideoEditJava_ConstantsClass*               pClass)
453{
454    bool   gotten = true;
455    jclass clazz  = NULL;
456    int    index  = 0;
457
458    // Check if the previous action succeeded.
459    if (*pResult)
460    {
461        // Log the function call.
462        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
463                "videoEditJava_initConstantClass(%s)", pClass->pName);
464
465        // Only initialize the class once.
466        if (!pClass->initialized)
467        {
468            // Look up the class.
469            videoEditJava_getClass(pResult, pEnv, pClass->pName, &clazz);
470
471            // Loop over the constants.
472            for (index = 0; index < pClass->count; index++)
473            {
474                // Look up the constant.
475                videoEditJava_getStaticIntField(pResult, pEnv, clazz,
476                                        pClass->pConstants[index].pName,
477                                        &pClass->pConstants[index].java);
478            }
479
480            // Check if all constants could be located.
481            if (*pResult)
482            {
483                // Set the initialized flag.
484                pClass->initialized = true;
485            }
486        }
487    }
488}
489
490const char*
491videoEditJava_getConstantClassName(
492                const VideoEditJava_ConstantsClass*         pClass,
493                int                                 value,
494                VideoEditJava_UnknownConstant               unknown)
495{
496    const char* pName = M4OSA_NULL;
497    int         index = 0;
498
499    // Loop over the list with constants.
500    for (index = 0;
501         ((M4OSA_NULL == pName) && (index < pClass->count));
502         index++)
503    {
504        // Check if the specified value matches the c value of the constant.
505        if (value == pClass->pConstants[index].c)
506        {
507            // Set the name.
508            pName = pClass->pConstants[index].pName;
509        }
510    }
511
512    // Check if no constant was found.
513    if (M4OSA_NULL == pName)
514    {
515        // Check if a function was specified to handle this case.
516        if (M4OSA_NULL != unknown)
517        {
518            // Pass the constant to the specified unknown function.
519            pName = unknown(value);
520        }
521        else
522        {
523            // Set the description to a default value.
524            pName = "<unknown>";
525        }
526    }
527
528    // Return the result.
529    return(pName);
530}
531
532const char*
533videoEditJava_getConstantClassString(
534                const VideoEditJava_ConstantsClass*         pClass,
535                int                                 value,
536                VideoEditJava_UnknownConstant               unknown)
537{
538    const char* pString = M4OSA_NULL;
539    int         index   = 0;
540
541    // Loop over the list with constants.
542    for (index = 0;
543         ((M4OSA_NULL == pString) && (index < pClass->count));
544         index++)
545    {
546        // Check if the specified value matches the c value of the constant.
547        if (value == pClass->pConstants[index].c)
548        {
549            // Set the description.
550            pString = pClass->pConstants[index].pDescription;
551        }
552    }
553
554    // Check if no constant was found.
555    if (M4OSA_NULL == pString)
556    {
557        // Check if a function was specified to handle this case.
558        if (M4OSA_NULL != unknown)
559        {
560            // Pass the constant to the specified unknown function.
561            pString = unknown(value);
562        }
563        else
564        {
565            // Set the description to a default value.
566            pString = "<unknown>";
567        }
568    }
569
570    // Return the result.
571    return(pString);
572}
573
574int
575videoEditJava_getConstantClassJavaToC(
576                bool*                               pResult,
577                const VideoEditJava_ConstantsClass*         pClass,
578                int                                 value)
579{
580    bool gotten = false;
581    int  index  = 0;
582
583    // Check if the previous action succeeded.
584    if (*pResult)
585    {
586        // Loop over the list with constants.
587        for (index = 0; ((!gotten) && (index < pClass->count)); index++)
588        {
589            // Check if the specified value matches the java value of the constant.
590            if (value == pClass->pConstants[index].java)
591            {
592                // Set the value to the c value.
593                value = pClass->pConstants[index].c;
594
595                // Set the gotten flag.
596                gotten = true;
597            }
598        }
599
600        // Check if the value was not found.
601        if (!gotten)
602        {
603            (*pResult) = false;
604        }
605    }
606
607    // Return the translated value.
608    return(value);
609}
610
611int
612videoEditJava_getConstantClassJavaToC(
613                bool*                               pResult,
614                const VideoEditJava_ConstantsClass*         pClass,
615                int                                 value,
616                int                                 unknown)
617{
618    bool gotten = false;
619    int  index  = 0;
620
621    // Check if the previous action succeeded.
622    if (*pResult)
623    {
624        // Loop over the list with constants.
625        for (index = 0; ((!gotten) && (index < pClass->count)); index++)
626        {
627            // Check if the specified value matches the java value of the constant.
628            if (value == pClass->pConstants[index].java)
629            {
630                // Set the value to the c value.
631                value = pClass->pConstants[index].c;
632
633                // Set the gotten flag.
634                gotten = true;
635            }
636        }
637
638        // If the constant was not found, look for the specified unknown.
639        if (!gotten)
640        {
641            // Set the value to the c value.
642            value = unknown;
643        }
644    }
645
646    // Return the translated value.
647    return(value);
648}
649
650int
651videoEditJava_getConstantClassCToJava(
652                const VideoEditJava_ConstantsClass*         pClass,
653                int                                 value)
654{
655    bool gotten = false;
656    int  index  = 0;
657
658    // Loop over the list with constants.
659    for (index = 0; ((!gotten) && (index < pClass->count)); index++)
660    {
661        // Check if the specified value matches the c value of the constant.
662        if (value == pClass->pConstants[index].c)
663        {
664            // Set the value to the java value.
665            value = pClass->pConstants[index].java;
666
667            // Set the gotten flag.
668            gotten = true;
669        }
670    }
671
672    // Return the translated value.
673    return(value);
674}
675
676int
677videoEditJava_getConstantClassCToJava(
678                const VideoEditJava_ConstantsClass*         pClass,
679                int                                 value,
680                int                                 unknown)
681{
682    bool gotten = false;
683    int  index  = 0;
684
685    // Loop over the list with constants.
686    for (index = 0; ((!gotten) && (index < pClass->count)); index++)
687    {
688        // Check if the specified value matches the c value of the constant.
689        if (value == pClass->pConstants[index].c)
690        {
691            // Set the value to the java value.
692            value = pClass->pConstants[index].java;
693
694            // Set the gotten flag.
695            gotten = true;
696        }
697    }
698
699    // If the constant was not found, look for the specified unknown.
700    if (!gotten)
701    {
702        // Loop over the list with constants.
703        for (index = 0; ((!gotten) && (index < pClass->count)); index++)
704        {
705            // Check if the specified value matches the java value of the constant.
706            if (unknown == pClass->pConstants[index].c)
707            {
708                // Set the value to the c value.
709                value = pClass->pConstants[index].java;
710
711                // Set the gotten flag.
712                gotten = true;
713            }
714        }
715    }
716
717    // Return the translated value.
718    return(value);
719}
720
721void
722videoEditJava_initFieldClass(
723                bool*                               pResult,
724                JNIEnv*                             pEnv,
725                VideoEditJava_FieldsClass*                  pClass)
726{
727    bool   gotten = true;
728    jclass clazz  = NULL;
729    int    index  = 0;
730
731    // Check if the previous action succeeded.
732    if (*pResult)
733    {
734        // Log the function call.
735        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
736                "videoEditJava_initFieldClass(%s)", pClass->pName);
737
738        // Only initialize the class once.
739        if (!pClass->initialized)
740        {
741            // Look up the class.
742            videoEditJava_getClass(pResult, pEnv, pClass->pName, &clazz);
743
744            // Loop over the fields.
745            for (index = 0; index < pClass->count; index++)
746            {
747                // Look up the field id.
748                videoEditJava_getFieldId(
749                        pResult,
750                        pEnv,
751                        clazz,
752                        pClass->pFields[index].pName,
753                        pClass->pFields[index].pType,
754                        &pClass->pFields[index].fieldId);
755            }
756
757            // Check if all fields could be located.
758            if (*pResult)
759            {
760                // Set the initialized flag.
761                pClass->initialized = true;
762            }
763        }
764    }
765}
766
767void
768videoEditJava_fieldClassClass(
769                bool*                               pResult,
770                JNIEnv*                             pEnv,
771                const VideoEditJava_FieldsClass*            pClass,
772                jclass*                             pClazz)
773{
774    // Check if the previous action succeeded.
775    if (*pResult)
776    {
777        // Check if the class is initialized.
778        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, (!pClass->initialized),
779                "field class not initialized");
780
781        // Get the class.
782        videoEditJava_getClass(pResult, pEnv, pClass->pName, pClazz);
783    }
784}
785
786void
787videoEditJava_fieldClassFieldIds(
788                bool*                               pResult,
789                JNIEnv*                             pEnv,
790                const VideoEditJava_FieldsClass*            pClass,
791                int                                 count,
792                VideoEditJava_FieldIds*                     pIds)
793{
794    int index = 0;
795
796    // Check if the previous action succeeded.
797    if (*pResult)
798    {
799        // Check if the class is initialized.
800        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, (!pClass->initialized),
801                "field class not initialized");
802
803        // Check if the number of fields matches.
804        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,
805                (pClass->count != count),
806                "field class type mismatch");
807
808        // Check if the class and object are valid.
809        if (*pResult)
810        {
811            // Loop over the class fields.
812            for (index = 0; index < count; index++)
813            {
814                // Copy the field ids.
815                pIds->fieldIds[index] = pClass->pFields[index].fieldId;
816            }
817        }
818    }
819}
820
821void
822videoEditJava_initMethodClass(
823                bool*                               pResult,
824                JNIEnv*                             pEnv,
825                VideoEditJava_MethodsClass*                 pClass)
826{
827    bool   gotten = true;
828    jclass clazz  = NULL;
829    int    index  = 0;
830
831    // Check if the previous action succeeded.
832    if (*pResult)
833    {
834        // Log the function call.
835        VIDEOEDIT_LOG_FUNCTION(ANDROID_LOG_INFO, "VIDEO_EDITOR_JAVA",
836                "videoEditJava_initMethodClass(%s)", pClass->pName);
837
838        // Only initialize the class once.
839        if (!pClass->initialized)
840        {
841            // Look up the class.
842            videoEditJava_getClass(pResult, pEnv, pClass->pName, &clazz);
843
844            // Loop over the methods.
845            for (index = 0; index < pClass->count; index++)
846            {
847                // Look up the method id.
848                videoEditJava_getMethodId(
849                        pResult,
850                        pEnv,
851                        clazz,
852                        pClass->pMethods[index].pName,
853                        pClass->pMethods[index].pType,
854                        &pClass->pMethods[index].methodId);
855            }
856
857            // Check if all methods could be located.
858            if (*pResult)
859            {
860                // Set the initialized flag.
861                pClass->initialized = true;
862            }
863        }
864    }
865}
866
867void
868videoEditJava_methodClassMethodIds(
869                bool*                               pResult,
870                JNIEnv*                             pEnv,
871                const VideoEditJava_MethodsClass*   pClass,
872                int                                 count,
873                VideoEditJava_MethodIds*            pIds)
874{
875    int index = 0;
876
877    // Check if the previous action succeeded.
878    if (*pResult)
879    {
880        // Check if the class is initialized.
881        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv, (!pClass->initialized),
882                    "method class not initialized");
883
884        // Check if the number of methods matches.
885        videoEditJava_checkAndThrowIllegalArgumentException(pResult, pEnv,\
886                    (pClass->count != count),
887                    "method class type mismatch");
888
889        // Check if the class and object are valid.
890        if (*pResult)
891        {
892            // Loop over the class methods.
893            for (index = 0; index < count; index++)
894            {
895                // Copy the method ids.
896                pIds->methodIds[index] = pClass->pMethods[index].methodId;
897            }
898        }
899    }
900}
901
902