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