Skip to content

Commit 3c2a1dc

Browse files
arosovAlexis Rosovsky
and
Alexis Rosovsky
authored
Crash after java callback if exception occurred (#154)
Also use env->ExceptionDescribe() to get name and location of thrown exception. Co-authored-by: Alexis Rosovsky <[email protected]>
1 parent f7f4ce0 commit 3c2a1dc

19 files changed

+86
-29
lines changed

webrtc-jni/src/main/cpp/dependencies/jni-voithos/src/JavaHashMap.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ namespace jni
3434
void JavaHashMap::put(const JavaRef<jobject> & key, const JavaRef<jobject> & value)
3535
{
3636
env->CallVoidMethod(jMap, mapClass->put, key.get(), value.get());
37+
ExceptionCheck(env);
3738
}
3839

3940
JavaMapIterator JavaHashMap::begin()
@@ -56,4 +57,4 @@ namespace jni
5657
put = GetMethod(env, cls, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
5758
entrySet = GetMethod(env, cls, "entrySet", "()Ljava/util/Set;");
5859
}
59-
}
60+
}

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ bool ExceptionCheck(JNIEnv * env)
2222
{
2323
if (env->ExceptionCheck()) {
2424
jthrowable exception = env->ExceptionOccurred();
25+
env->ExceptionDescribe();
2526
env->ExceptionClear();
2627

2728
if (exception) {
@@ -123,7 +124,7 @@ jfieldID GetFieldID(JNIEnv * env, jobject obj, const std::string & fieldName, co
123124
jfieldID GetFieldID(JNIEnv * env, jclass cls, const std::string & fieldName, const char * type)
124125
{
125126
jfieldID field = env->GetFieldID(cls, fieldName.c_str(), type);
126-
127+
127128
if (field == nullptr) {
128129
ExceptionCheck(env);
129130
return nullptr;
@@ -137,4 +138,4 @@ JNIEnv * AttachCurrentThread()
137138
thread_local std::unique_ptr<jni::JavaThreadEnv> threadEnv(new jni::JavaThreadEnv(javaContext->getVM()));
138139

139140
return threadEnv->getEnv();
140-
}
141+
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_audio_AudioDeviceModule_setR
199199
}
200200

201201
jni::JavaObject obj(env, jni::JavaLocalRef<jobject>(env, device));
202-
202+
203203
const auto javaClass = jni::JavaClasses::get<jni::AudioDevice::JavaAudioDeviceClass>(env);
204204
const std::string devGuid = jni::JavaString::toNative(env, obj.getString(javaClass->descriptor));
205205

@@ -495,4 +495,4 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_audio_AudioDeviceModule_init
495495
}
496496

497497
SetHandle(env, caller, audioModule.release());
498-
}
498+
}

webrtc-jni/src/main/cpp/src/api/AudioTrackSink.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ namespace jni
3737
env->SetByteArrayRegion(dataArray, 0, dataSize, buffer);
3838

3939
env->CallVoidMethod(sink, javaClass->onData, dataArray, bitsPerSample, sampleRate, channels, frames);
40+
ExceptionCheck(env);
4041
env->DeleteLocalRef(dataArray);
4142
}
4243

webrtc-jni/src/main/cpp/src/api/CreateSessionDescriptionObserver.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ namespace jni
3535
JavaLocalRef<jobject> javaDesc = jni::RTCSessionDescription::toJava(env, desc);
3636

3737
env->CallVoidMethod(observer, javaClass->onSuccess, javaDesc.get());
38+
39+
ExceptionCheck(env);
3840
}
3941

4042
void CreateSessionDescriptionObserver::OnFailure(webrtc::RTCError error)
@@ -44,6 +46,8 @@ namespace jni
4446
JavaLocalRef<jstring> errorMessage = JavaString::toJava(env, RTCErrorToString(error));
4547

4648
env->CallVoidMethod(observer, javaClass->onFailure, errorMessage.get());
49+
50+
ExceptionCheck(env);
4751
}
4852

4953
CreateSessionDescriptionObserver::JavaCreateSessionDescObserverClass::JavaCreateSessionDescObserverClass(JNIEnv * env)
@@ -53,4 +57,4 @@ namespace jni
5357
onSuccess = GetMethod(env, cls, "onSuccess", "(L" PKG "RTCSessionDescription;)V");
5458
onFailure = GetMethod(env, cls, "onFailure", "(" STRING_SIG ")V");
5559
}
56-
}
60+
}

webrtc-jni/src/main/cpp/src/api/PeerConnectionObserver.cpp

+28-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ namespace jni
4242
auto jState = JavaEnums::toJava(env, state);
4343

4444
env->CallVoidMethod(observer, javaClass->onConnectionChange, jState.get());
45+
46+
ExceptionCheck(env);
4547
}
4648

4749
void PeerConnectionObserver::OnSignalingChange(webrtc::PeerConnectionInterface::SignalingState state)
@@ -51,6 +53,8 @@ namespace jni
5153
auto jState = JavaEnums::toJava(env, state);
5254

5355
env->CallVoidMethod(observer, javaClass->onSignalingChange, jState.get());
56+
57+
ExceptionCheck(env);
5458
}
5559

5660
void PeerConnectionObserver::OnTrack(rtc::scoped_refptr<webrtc::RtpTransceiverInterface> transceiver)
@@ -60,6 +64,8 @@ namespace jni
6064
auto jTransceiver = JavaFactories::create(env, transceiver.get());
6165

6266
env->CallVoidMethod(observer, javaClass->onTrack, jTransceiver.get());
67+
68+
ExceptionCheck(env);
6369
}
6470

6571
void PeerConnectionObserver::OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> & streams)
@@ -78,6 +84,8 @@ namespace jni
7884
catch (...) {
7985
ThrowCxxJavaException(env);
8086
}
87+
88+
ExceptionCheck(env);
8189
}
8290

8391
void PeerConnectionObserver::OnRemoveTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver)
@@ -87,6 +95,8 @@ namespace jni
8795
auto jReceiver = JavaFactories::create(env, receiver.get());
8896

8997
env->CallVoidMethod(observer, javaClass->onRemoveTrack, jReceiver.get());
98+
99+
ExceptionCheck(env);
90100
}
91101

92102
void PeerConnectionObserver::OnDataChannel(rtc::scoped_refptr<webrtc::DataChannelInterface> channel)
@@ -96,13 +106,17 @@ namespace jni
96106
auto jDataChannel = JavaFactories::create(env, channel.release());
97107

98108
env->CallVoidMethod(observer, javaClass->onDataChannel, jDataChannel.get());
109+
110+
ExceptionCheck(env);
99111
}
100112

101113
void PeerConnectionObserver::OnRenegotiationNeeded()
102114
{
103115
JNIEnv * env = AttachCurrentThread();
104116

105117
env->CallVoidMethod(observer, javaClass->onRenegotiationNeeded);
118+
119+
ExceptionCheck(env);
106120
}
107121

108122
void PeerConnectionObserver::OnIceConnectionChange(webrtc::PeerConnectionInterface::IceConnectionState state)
@@ -112,6 +126,8 @@ namespace jni
112126
auto jState = JavaEnums::toJava(env, state);
113127

114128
env->CallVoidMethod(observer, javaClass->onIceConnectionChange, jState.get());
129+
130+
ExceptionCheck(env);
115131
}
116132

117133
void PeerConnectionObserver::OnIceGatheringChange(webrtc::PeerConnectionInterface::IceGatheringState state)
@@ -121,6 +137,8 @@ namespace jni
121137
auto jState = JavaEnums::toJava(env, state);
122138

123139
env->CallVoidMethod(observer, javaClass->onIceGatheringChange, jState.get());
140+
141+
ExceptionCheck(env);
124142
}
125143

126144
void PeerConnectionObserver::OnIceCandidate(const webrtc::IceCandidateInterface * candidate)
@@ -130,6 +148,8 @@ namespace jni
130148
JavaLocalRef<jobject> jCandidate = RTCIceCandidate::toJava(env, candidate);
131149

132150
env->CallVoidMethod(observer, javaClass->onIceCandidate, jCandidate.get());
151+
152+
ExceptionCheck(env);
133153
}
134154

135155
void PeerConnectionObserver::OnIceCandidateError(const std::string & address, int port, const std::string & url, int error_code, const std::string & error_text)
@@ -139,8 +159,10 @@ namespace jni
139159
JavaLocalRef<jobject> event = RTCPeerConnectionIceErrorEvent::toJava(env, address, port, url, error_code, error_text);
140160

141161
env->CallVoidMethod(observer, javaClass->onIceCandidateError, event.get());
162+
163+
ExceptionCheck(env);
142164
}
143-
165+
144166
void PeerConnectionObserver::OnIceCandidatesRemoved(const std::vector<cricket::Candidate> & candidates)
145167
{
146168
JNIEnv * env = AttachCurrentThread();
@@ -158,13 +180,17 @@ namespace jni
158180
catch (...) {
159181
ThrowCxxJavaException(env);
160182
}
183+
184+
ExceptionCheck(env);
161185
}
162186

163187
void PeerConnectionObserver::OnIceConnectionReceivingChange(bool receiving)
164188
{
165189
JNIEnv * env = AttachCurrentThread();
166190

167191
env->CallVoidMethod(observer, javaClass->onIceConnectionReceivingChange, receiving);
192+
193+
ExceptionCheck(env);
168194
}
169195

170196
PeerConnectionObserver::JavaPeerConnectionObserverClass::JavaPeerConnectionObserverClass(JNIEnv * env)
@@ -185,4 +211,4 @@ namespace jni
185211
onIceCandidatesRemoved = GetMethod(env, cls, "onIceCandidatesRemoved", "([L" PKG "RTCIceCandidate;)V");
186212
onIceConnectionReceivingChange = GetMethod(env, cls, "onIceConnectionReceivingChange", "(Z)V");
187213
}
188-
}
214+
}

webrtc-jni/src/main/cpp/src/api/RTCDataChannelObserver.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ namespace jni
3333
JNIEnv * env = AttachCurrentThread();
3434

3535
env->CallVoidMethod(observer, javaClass->onStateChange);
36+
37+
ExceptionCheck(env);
3638
}
3739

3840
void RTCDataChannelObserver::OnMessage(const webrtc::DataBuffer & buffer)
@@ -42,6 +44,8 @@ namespace jni
4244
JavaLocalRef<jobject> jBuffer = bufferFactory->create(env, &buffer);
4345

4446
env->CallVoidMethod(observer, javaClass->onMessage, jBuffer.release());
47+
48+
ExceptionCheck(env);
4549
}
4650

4751
RTCDataChannelObserver::JavaRTCDataChannelObserverClass::JavaRTCDataChannelObserverClass(JNIEnv * env)
@@ -51,4 +55,4 @@ namespace jni
5155
onStateChange = GetMethod(env, cls, "onStateChange", "()V");
5256
onMessage = GetMethod(env, cls, "onMessage", "(L" PKG "RTCDataChannelBuffer;)V");
5357
}
54-
}
58+
}

webrtc-jni/src/main/cpp/src/api/RTCDtlsTransportObserver.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,12 @@ namespace jni
3333
void RTCDtlsTransportObserver::OnStateChange(webrtc::DtlsTransportInformation info)
3434
{
3535
JNIEnv * env = AttachCurrentThread();
36-
36+
3737
auto state = JavaEnums::toJava(env, info.state());
3838

3939
env->CallVoidMethod(observer, javaClass->onStateChange, state.get());
40+
41+
ExceptionCheck(env);
4042
}
4143

4244
void RTCDtlsTransportObserver::OnError(webrtc::RTCError error)
@@ -46,6 +48,8 @@ namespace jni
4648
JavaLocalRef<jstring> errorMessage = JavaString::toJava(env, RTCErrorToString(error));
4749

4850
env->CallVoidMethod(observer, javaClass->onError, errorMessage.get());
51+
52+
ExceptionCheck(env);
4953
}
5054

5155
RTCDtlsTransportObserver::JavaRTCDtlsTransportObserverClass::JavaRTCDtlsTransportObserverClass(JNIEnv * env)
@@ -55,4 +59,4 @@ namespace jni
5559
onStateChange = GetMethod(env, cls, "onStateChange", "(L" PKG "RTCDtlsTransportState;)V");
5660
onError = GetMethod(env, cls, "onError", "(" STRING_SIG ")V");
5761
}
58-
}
62+
}

webrtc-jni/src/main/cpp/src/api/RTCRtpCodecCapability.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ namespace jni
6161
JavaObject obj(env, capability);
6262

6363
webrtc::RtpCodecCapability codecCapability;
64-
64+
6565
codecCapability.kind = JavaEnums::toNative<cricket::MediaType>(env, obj.getObject(javaClass->mediaType));
6666
codecCapability.name = JavaString::toNative(env, obj.getString(javaClass->name));
6767
codecCapability.clock_rate = obj.getInt<int>(javaClass->clockRate);
6868
codecCapability.num_channels = obj.getInt<int>(javaClass->channels);
69-
69+
7070
for (const auto & entry : JavaHashMap(env, obj.getObject(javaClass->sdpFmtp))) {
7171
std::string key = JavaString::toNative(env, static_java_ref_cast<jstring>(env, entry.first));
7272
std::string value = JavaString::toNative(env, static_java_ref_cast<jstring>(env, entry.second));

webrtc-jni/src/main/cpp/src/api/RTCRtpEncodingParameters.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace jni
5151

5252
return JavaLocalRef<jobject>(env, object);
5353
}
54-
54+
5555
webrtc::RtpEncodingParameters toNative(JNIEnv * env, const JavaRef<jobject> & parameters)
5656
{
5757
const auto javaClass = JavaClasses::get<JavaRTCRtpEncodingParametersClass>(env);
@@ -94,7 +94,7 @@ namespace jni
9494
cls = FindClass(env, PKG"RTCRtpEncodingParameters");
9595

9696
ctor = GetMethod(env, cls, "<init>", "()V");
97-
97+
9898
ssrc = GetFieldID(env, cls, "ssrc", LONG_SIG);
9999
active = GetFieldID(env, cls, "active", BOOLEAN_SIG);
100100
minBitrate = GetFieldID(env, cls, "minBitrate", INTEGER_SIG);
@@ -103,4 +103,4 @@ namespace jni
103103
scaleResolution = GetFieldID(env, cls, "scaleResolutionDownBy", DOUBLE_SIG);
104104
}
105105
}
106-
}
106+
}

webrtc-jni/src/main/cpp/src/api/RTCSessionDescription.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ namespace jni
3434

3535
std::string sdpStr;
3636
nativeType->ToString(&sdpStr);
37-
37+
3838
JavaLocalRef<jobject> type = JavaEnums::toJava(env, nativeType->GetType());
3939
JavaLocalRef<jstring> sdp = JavaString::toJava(env, sdpStr);
4040

@@ -75,4 +75,4 @@ namespace jni
7575
sdp = GetFieldID(env, cls, "sdp", STRING_SIG);
7676
}
7777
}
78-
}
78+
}

webrtc-jni/src/main/cpp/src/api/RTCStatsCollectorCallback.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ namespace jni
3434
JavaLocalRef<jobject> javaReport = jni::RTCStatsReport::toJava(env, report);
3535

3636
env->CallVoidMethod(callback, javaClass->onStatsDelivered, javaReport.get());
37+
38+
ExceptionCheck(env);
3739
}
3840

3941
RTCStatsCollectorCallback::JavaRTCStatsCollectorCallbackClass::JavaRTCStatsCollectorCallbackClass(JNIEnv * env)
@@ -42,4 +44,4 @@ namespace jni
4244

4345
onStatsDelivered = GetMethod(env, cls, "onStatsDelivered", "(L" PKG "RTCStatsReport;)V");
4446
}
45-
}
47+
}

webrtc-jni/src/main/cpp/src/api/SetSessionDescriptionObserver.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "api/WebRTCUtils.h"
1919
#include "JavaString.h"
2020
#include "JNI_WebRTC.h"
21+
#include "JavaUtils.h"
2122

2223
namespace jni
2324
{
@@ -32,6 +33,8 @@ namespace jni
3233
JNIEnv * env = AttachCurrentThread();
3334

3435
env->CallVoidMethod(observer, javaClass->onSuccess);
36+
37+
ExceptionCheck(env);
3538
}
3639

3740
void SetSessionDescriptionObserver::OnFailure(webrtc::RTCError error)
@@ -41,6 +44,8 @@ namespace jni
4144
JavaLocalRef<jstring> errorMessage = JavaString::toJava(env, RTCErrorToString(error));
4245

4346
env->CallVoidMethod(observer, javaClass->onFailure, errorMessage.get());
47+
48+
ExceptionCheck(env);
4449
}
4550

4651
SetSessionDescriptionObserver::JavaSetSessionDescObserverClass::JavaSetSessionDescObserverClass(JNIEnv * env)
@@ -50,4 +55,4 @@ namespace jni
5055
onSuccess = GetMethod(env, cls, "onSuccess", "()V");
5156
onFailure = GetMethod(env, cls, "onFailure", "(" STRING_SIG ")V");
5257
}
53-
}
58+
}

webrtc-jni/src/main/cpp/src/api/VideoFrame.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ namespace jni
4747
JavaLocalRef<jobject> toJava(JNIEnv * env, const rtc::scoped_refptr<webrtc::I420BufferInterface> & buffer)
4848
{
4949
const auto javaClass = JavaClasses::get<JavaNativeI420BufferClass>(env);
50-
50+
5151
jobject yBuffer = env->NewDirectByteBuffer(const_cast<uint8_t *>(buffer->DataY()), static_cast<jlong>(buffer->StrideY()) * buffer->height());
5252
jobject uBuffer = env->NewDirectByteBuffer(const_cast<uint8_t *>(buffer->DataU()), static_cast<jlong>(buffer->StrideU()) * buffer->ChromaHeight());
5353
jobject vBuffer = env->NewDirectByteBuffer(const_cast<uint8_t *>(buffer->DataV()), static_cast<jlong>(buffer->StrideV()) * buffer->ChromaHeight());

0 commit comments

Comments
 (0)