Skip to content

Commit 04945d2

Browse files
authored
JNI: Fix logging cleanup issue (#1239)
* JNI: Fix logging after free * Change gstreamer from gitlab to github mirror * Address comments
1 parent c3e70fb commit 04945d2

File tree

4 files changed

+44
-33
lines changed

4 files changed

+44
-33
lines changed

.github/workflows/samples.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ jobs:
201201
- name: Build GST RTSP Server Test Launch Sample
202202
run: |
203203
set -x
204-
git clone --no-checkout --filter=blob:none --depth=1 -b 1.22 https://gitlab.freedesktop.org/gstreamer/gstreamer.git
204+
git clone --no-checkout --filter=blob:none --depth=1 -b 1.22 https://github.com/GStreamer/gstreamer.git
205205
cd gstreamer
206206
git sparse-checkout init cone
207207
git sparse-checkout set "subprojects/gst-rtsp-server/examples/test-launch.c"

src/JNI/com/amazonaws/kinesis/video/producer/jni/KinesisVideoClientWrapper.cpp

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -55,31 +55,32 @@ KinesisVideoClientWrapper::KinesisVideoClientWrapper(JNIEnv* env,
5555
KinesisVideoClientWrapper::~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-
8384
void KinesisVideoClientWrapper::stopKinesisVideoStreams()
8485
{
8586
STATUS retStatus = STATUS_SUCCESS;
@@ -2623,22 +2624,37 @@ AUTH_INFO_TYPE KinesisVideoClientWrapper::authInfoTypeFromInt(UINT32 authInfoTyp
26232624
VOID 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, 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
}
2691-
}
2707+
}

src/JNI/com/amazonaws/kinesis/video/producer/jni/NativeProducerInterface.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,14 @@ extern "C" {
4848
CHECK(env != NULL && thiz != NULL);
4949

5050
KinesisVideoClientWrapper* pWrapper = FROM_WRAPPER_HANDLE(handle);
51-
if (pWrapper != NULL) {
52-
// Cache the globalRef for later deletion
53-
jobject globalRef = pWrapper->getGlobalRef();
5451

55-
// Free the existing engine
56-
delete pWrapper;
52+
// Calling leave early since the logger is part of pWrapper.
53+
// Avoiding errors by logging after free
54+
LEAVE();
5755

58-
// Free the global reference
59-
if (globalRef != NULL) {
60-
env->DeleteGlobalRef(globalRef);
61-
}
56+
if (pWrapper != NULL) {
57+
delete pWrapper;
6258
}
63-
64-
LEAVE();
6559
}
6660

6761
/**

src/JNI/include/com/amazonaws/kinesis/video/producer/jni/JNICommon.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <jni.h> // Basic native API
99
#include <string.h>
10+
#include <iostream>
1011

1112
#define EXCEPTION_NAME "com/amazonaws/kinesisvideo/producer/ProducerException"
1213

0 commit comments

Comments
 (0)