@@ -55,31 +55,32 @@ KinesisVideoClientWrapper::KinesisVideoClientWrapper(JNIEnv* env,
5555KinesisVideoClientWrapper::~KinesisVideoClientWrapper ()
5656{
5757 STATUS retStatus = STATUS_SUCCESS;
58+ JNIEnv *env;
59+
60+ if (mJvm == NULL ) {
61+ return ;
62+ }
63+
64+ mJvm ->GetEnv ((PVOID*) &env, JNI_VERSION_1_6);
65+
5866 if (IS_VALID_CLIENT_HANDLE (mClientHandle ))
5967 {
6068 if (STATUS_FAILED (retStatus = freeKinesisVideoClient (&mClientHandle ))) {
6169 DLOGE (" Failed to free the producer client object" );
62- JNIEnv * env;
63- mJvm -> GetEnv ((PVOID*) & env, JNI_VERSION_1_6 );
64- throwNativeException (env, EXCEPTION_NAME, " Failed to free the producer client object. " , retStatus);
70+ if ( env != NULL ) {
71+ throwNativeException ( env, EXCEPTION_NAME, " Failed to free the producer client object. " , retStatus );
72+ }
6573 return ;
6674 }
6775 }
68- }
6976
70- void KinesisVideoClientWrapper::deleteGlobalRef (JNIEnv* env)
71- {
72- // Release the global reference to JNI object
73- if (mGlobalJniObjRef != NULL ) {
77+ // You cannot log anything after this!
78+ if (env != NULL && mGlobalJniObjRef != NULL ) {
7479 env->DeleteGlobalRef (mGlobalJniObjRef );
80+ mGlobalJniObjRef = NULL ;
7581 }
7682}
7783
78- jobject KinesisVideoClientWrapper::getGlobalRef ()
79- {
80- return mGlobalJniObjRef ;
81- }
82-
8384void KinesisVideoClientWrapper::stopKinesisVideoStreams ()
8485{
8586 STATUS retStatus = STATUS_SUCCESS;
@@ -2623,22 +2624,37 @@ AUTH_INFO_TYPE KinesisVideoClientWrapper::authInfoTypeFromInt(UINT32 authInfoTyp
26232624VOID KinesisVideoClientWrapper::logPrintFunc (UINT32 level, PCHAR tag, PCHAR fmt, ...)
26242625{
26252626 JNIEnv *env;
2626- BOOL detached = FALSE ;
2627+ BOOL attached = FALSE ;
26272628 STATUS retStatus = STATUS_SUCCESS;
26282629 jstring jstrTag = NULL , jstrFmt = NULL , jstrBuffer = NULL ;
26292630 CHAR buffer[MAX_LOG_MESSAGE_LENGTH];
2631+ va_list list;
2632+ INT32 envState;
26302633
2631- CHECK (mJvm != NULL && mGlobalJniObjRef != NULL );
2634+ // Prevent infinite logging loops if mGlobalJniObjRef has already been freed
2635+ if (mGlobalJniObjRef == NULL ) {
2636+ va_list args;
2637+ va_start (args, fmt);
2638+ vsnprintf (buffer, MAX_LOG_MESSAGE_LENGTH, fmt, args);
2639+ va_end (args);
26322640
2633- INT32 envState = mJvm ->GetEnv ((PVOID*) &env, JNI_VERSION_1_6);
2641+ // Print debug info
2642+ std::cout << " logPrintFunc called after free! "
2643+ << " Level: " << level << " , Tag: " << (tag ? tag : " NULL" )
2644+ << " , Message: " << buffer << std::endl;
2645+
2646+ CHK (FALSE , STATUS_SUCCESS);
2647+ }
2648+ CHK (mJvm != NULL && mGlobalJniObjRef != NULL , STATUS_SUCCESS);
2649+
2650+ envState = mJvm ->GetEnv ((PVOID*) &env, JNI_VERSION_1_6);
26342651 if (envState == JNI_EDETACHED) {
26352652 if (mJvm ->AttachCurrentThread ((PVOID*) &env, NULL ) != 0 ) {
26362653 goto CleanUp;
26372654 }
2638- detached = TRUE ;
2655+ attached = TRUE ;
26392656 }
2640-
2641- va_list list;
2657+
26422658 va_start (list, fmt);
26432659 vsnprintf (buffer, MAX_LOG_MESSAGE_LENGTH, fmt, list);
26442660 va_end (list);
@@ -2685,7 +2701,7 @@ VOID KinesisVideoClientWrapper::logPrintFunc(UINT32 level, PCHAR tag, PCHAR fmt,
26852701 }
26862702
26872703 // Detach the thread if we have attached it to JVM
2688- if (detached ) {
2704+ if (attached ) {
26892705 mJvm ->DetachCurrentThread ();
26902706 }
26912707}
0 commit comments