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
24 extern "C" {
25 #include <M4OSA_CharStar.h>
26 };
27
28
29 void
videoEditJava_checkAndThrowIllegalArgumentExceptionFunc(bool * pResult,JNIEnv * pEnv,bool condition,const char * pMessage,const char * pFile,int lineNo)30 videoEditJava_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
58 void
videoEditJava_checkAndThrowRuntimeExceptionFunc(bool * pResult,JNIEnv * pEnv,bool condition,M4OSA_ERR result,const char * pFile,int lineNo)59 videoEditJava_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
93 void
videoEditJava_checkAndThrowIllegalStateExceptionFunc(bool * pResult,JNIEnv * pEnv,bool condition,const char * pMessage,const char * pFile,int lineNo)94 videoEditJava_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
123 void
videoEditJava_getClass(bool * pResult,JNIEnv * pEnv,const char * pName,jclass * pClazz)124 videoEditJava_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
165 void
videoEditJava_getMethodId(bool * pResult,JNIEnv * pEnv,jclass clazz,const char * pName,const char * pType,jmethodID * pMethodId)166 videoEditJava_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
209 void
videoEditJava_getFieldId(bool * pResult,JNIEnv * pEnv,jclass clazz,const char * pName,const char * pType,jfieldID * pFieldId)210 videoEditJava_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
253 void
videoEditJava_getObject(bool * pResult,JNIEnv * pEnv,jobject object,jfieldID objectFieldId,jobject * pObject)254 videoEditJava_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
276 void
videoEditJava_getArray(bool * pResult,JNIEnv * pEnv,jobject object,jfieldID arrayFieldId,jobjectArray * pArray,jsize * pArraySize)277 videoEditJava_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
311 void*
videoEditJava_getString(bool * pResult,JNIEnv * pEnv,jobject object,jfieldID stringFieldId,M4OSA_UInt32 * pLength)312 videoEditJava_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
401 void
videoEditJava_getStaticIntField(bool * pResult,JNIEnv * pEnv,jclass clazz,const char * pName,int * pValue)402 videoEditJava_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
448 void
videoEditJava_initConstantClass(bool * pResult,JNIEnv * pEnv,VideoEditJava_ConstantsClass * pClass)449 videoEditJava_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
490 const char*
videoEditJava_getConstantClassName(const VideoEditJava_ConstantsClass * pClass,int value,VideoEditJava_UnknownConstant unknown)491 videoEditJava_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
532 const char*
videoEditJava_getConstantClassString(const VideoEditJava_ConstantsClass * pClass,int value,VideoEditJava_UnknownConstant unknown)533 videoEditJava_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
574 int
videoEditJava_getConstantClassJavaToC(bool * pResult,const VideoEditJava_ConstantsClass * pClass,int value)575 videoEditJava_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
611 int
videoEditJava_getConstantClassJavaToC(bool * pResult,const VideoEditJava_ConstantsClass * pClass,int value,int unknown)612 videoEditJava_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
650 int
videoEditJava_getConstantClassCToJava(const VideoEditJava_ConstantsClass * pClass,int value)651 videoEditJava_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
676 int
videoEditJava_getConstantClassCToJava(const VideoEditJava_ConstantsClass * pClass,int value,int unknown)677 videoEditJava_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
721 void
videoEditJava_initFieldClass(bool * pResult,JNIEnv * pEnv,VideoEditJava_FieldsClass * pClass)722 videoEditJava_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
767 void
videoEditJava_fieldClassClass(bool * pResult,JNIEnv * pEnv,const VideoEditJava_FieldsClass * pClass,jclass * pClazz)768 videoEditJava_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
786 void
videoEditJava_fieldClassFieldIds(bool * pResult,JNIEnv * pEnv,const VideoEditJava_FieldsClass * pClass,int count,VideoEditJava_FieldIds * pIds)787 videoEditJava_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
821 void
videoEditJava_initMethodClass(bool * pResult,JNIEnv * pEnv,VideoEditJava_MethodsClass * pClass)822 videoEditJava_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
867 void
videoEditJava_methodClassMethodIds(bool * pResult,JNIEnv * pEnv,const VideoEditJava_MethodsClass * pClass,int count,VideoEditJava_MethodIds * pIds)868 videoEditJava_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