Skip to content

Commit e075d60

Browse files
committed
Fixed NPE on RTCPeerConnection.getConnectionState when peer-connection has been closed #35
1 parent 3182d06 commit e075d60

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

webrtc-jni/src/main/cpp/dependencies/jni-voithos/include/JavaUtils.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
} \
2727
} while(0)
2828

29-
#define CHECK_HANDLEV(handle, retValue) \
29+
#define CHECK_HANDLEV(handle, retValue) \
3030
do { \
3131
if (handle == NULL) { \
3232
JNIEnv * env = AttachCurrentThread(); \
@@ -35,6 +35,13 @@
3535
} \
3636
} while(0)
3737

38+
#define CHECK_HANDLE_DEFAULT(handle, retValue) \
39+
do { \
40+
if (handle == NULL) { \
41+
return retValue; \
42+
} \
43+
} while(0)
44+
3845
void ThrowCxxJavaException(JNIEnv * env);
3946
JNIEnv * AttachCurrentThread();
4047
bool ExceptionCheck(JNIEnv * env);

webrtc-jni/src/main/cpp/src/JNI_RTCPeerConnection.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ JNIEXPORT jobject JNICALL Java_dev_onvoid_webrtc_RTCPeerConnection_getSignalingS
447447
(JNIEnv * env, jobject caller)
448448
{
449449
webrtc::PeerConnectionInterface * pc = GetHandle<webrtc::PeerConnectionInterface>(env, caller);
450-
CHECK_HANDLEV(pc, nullptr);
450+
CHECK_HANDLE_DEFAULT(pc, jni::JavaEnums::toJava(env, webrtc::PeerConnectionInterface::SignalingState::kClosed).release());
451451

452452
return jni::JavaEnums::toJava(env, pc->signaling_state()).release();
453453
}
@@ -456,7 +456,7 @@ JNIEXPORT jobject JNICALL Java_dev_onvoid_webrtc_RTCPeerConnection_getIceGatheri
456456
(JNIEnv * env, jobject caller)
457457
{
458458
webrtc::PeerConnectionInterface * pc = GetHandle<webrtc::PeerConnectionInterface>(env, caller);
459-
CHECK_HANDLEV(pc, nullptr);
459+
CHECK_HANDLE_DEFAULT(pc, jni::JavaEnums::toJava(env, webrtc::PeerConnectionInterface::IceGatheringState::kIceGatheringNew).release());
460460

461461
return jni::JavaEnums::toJava(env, pc->ice_gathering_state()).release();
462462
}
@@ -465,7 +465,7 @@ JNIEXPORT jobject JNICALL Java_dev_onvoid_webrtc_RTCPeerConnection_getIceConnect
465465
(JNIEnv * env, jobject caller)
466466
{
467467
webrtc::PeerConnectionInterface * pc = GetHandle<webrtc::PeerConnectionInterface>(env, caller);
468-
CHECK_HANDLEV(pc, nullptr);
468+
CHECK_HANDLE_DEFAULT(pc, jni::JavaEnums::toJava(env, webrtc::PeerConnectionInterface::IceConnectionState::kIceConnectionClosed).release());
469469

470470
return jni::JavaEnums::toJava(env, pc->ice_connection_state()).release();
471471
}
@@ -474,7 +474,7 @@ JNIEXPORT jobject JNICALL Java_dev_onvoid_webrtc_RTCPeerConnection_getConnection
474474
(JNIEnv * env, jobject caller)
475475
{
476476
webrtc::PeerConnectionInterface * pc = GetHandle<webrtc::PeerConnectionInterface>(env, caller);
477-
CHECK_HANDLEV(pc, nullptr);
477+
CHECK_HANDLE_DEFAULT(pc, jni::JavaEnums::toJava(env, webrtc::PeerConnectionInterface::PeerConnectionState::kClosed).release());
478478

479479
return jni::JavaEnums::toJava(env, pc->peer_connection_state()).release();
480480
}

webrtc/src/test/java/dev/onvoid/webrtc/RTCPeerConnectionTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,4 +374,24 @@ void getStats() throws InterruptedException {
374374
assertNotNull(statsReport.getStats());
375375
assertFalse(statsReport.getStats().isEmpty());
376376
}
377+
378+
@Test
379+
void statesWhenClosed() {
380+
RTCConfiguration config = new RTCConfiguration();
381+
PeerConnectionObserver observer = candidate -> { };
382+
383+
RTCPeerConnection peerConnection = factory.createPeerConnection(config, observer);
384+
385+
assertEquals(RTCPeerConnectionState.NEW, peerConnection.getConnectionState());
386+
assertEquals(RTCSignalingState.STABLE, peerConnection.getSignalingState());
387+
assertEquals(RTCIceGatheringState.NEW, peerConnection.getIceGatheringState());
388+
assertEquals(RTCIceConnectionState.NEW, peerConnection.getIceConnectionState());
389+
390+
peerConnection.close();
391+
392+
assertEquals(RTCPeerConnectionState.CLOSED, peerConnection.getConnectionState());
393+
assertEquals(RTCSignalingState.CLOSED, peerConnection.getSignalingState());
394+
assertEquals(RTCIceGatheringState.NEW, peerConnection.getIceGatheringState());
395+
assertEquals(RTCIceConnectionState.CLOSED, peerConnection.getIceConnectionState());
396+
}
377397
}

0 commit comments

Comments
 (0)