Index: webrtc/api/java/jni/peerconnection_jni.cc |
diff --git a/webrtc/api/java/jni/peerconnection_jni.cc b/webrtc/api/java/jni/peerconnection_jni.cc |
index f7b9e90202c7a4179f25079018f2e313aef0a947..816df8f41be3392613f5ed94c9f04bc773bee8b9 100644 |
--- a/webrtc/api/java/jni/peerconnection_jni.cc |
+++ b/webrtc/api/java/jni/peerconnection_jni.cc |
@@ -91,6 +91,7 @@ using webrtc::DataChannelInit; |
using webrtc::DataChannelInterface; |
using webrtc::DataChannelObserver; |
using webrtc::IceCandidateInterface; |
+using webrtc::IceCandidateInterfaceRefPtr; |
using webrtc::LogcatTraceContext; |
using webrtc::MediaConstraintsInterface; |
using webrtc::MediaSourceInterface; |
@@ -188,22 +189,25 @@ class PCOJava : public PeerConnectionObserver { |
void OnIceCandidate(const IceCandidateInterface* candidate) override { |
ScopedLocalRefFrame local_ref_frame(jni()); |
- std::string sdp; |
- RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp; |
jclass candidate_class = FindClass(jni(), "org/webrtc/IceCandidate"); |
- jmethodID ctor = GetMethodID(jni(), candidate_class, |
- "<init>", "(Ljava/lang/String;ILjava/lang/String;)V"); |
- jstring j_mid = JavaStringFromStdString(jni(), candidate->sdp_mid()); |
- jstring j_sdp = JavaStringFromStdString(jni(), sdp); |
- jobject j_candidate = jni()->NewObject( |
- candidate_class, ctor, j_mid, candidate->sdp_mline_index(), j_sdp); |
- CHECK_EXCEPTION(jni()) << "error during NewObject"; |
+ jobject j_candidate = ToJavaCandidate(jni(), &candidate_class, candidate); |
jmethodID m = GetMethodID(jni(), *j_observer_class_, |
"onIceCandidate", "(Lorg/webrtc/IceCandidate;)V"); |
jni()->CallVoidMethod(*j_observer_global_, m, j_candidate); |
CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
} |
+ void OnIceCandidatesRemoved( |
+ const std::vector<IceCandidateInterfaceRefPtr>& candidates) { |
+ ScopedLocalRefFrame local_ref_frame(jni()); |
+ jobjectArray candidates_array = ToJavaCandidateArray(jni(), candidates); |
+ jmethodID m = |
+ GetMethodID(jni(), *j_observer_class_, "onIceCandidatesRemoved", |
+ "([Lorg/webrtc/IceCandidate;)V"); |
+ jni()->CallVoidMethod(*j_observer_global_, m, candidates_array); |
+ CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod"; |
+ } |
+ |
void OnSignalingChange( |
PeerConnectionInterface::SignalingState new_state) override { |
ScopedLocalRefFrame local_ref_frame(jni()); |
@@ -371,6 +375,36 @@ class PCOJava : public PeerConnectionObserver { |
DeleteGlobalRef(jni(), j_stream); |
} |
+ jobject ToJavaCandidate(JNIEnv* jni, |
+ jclass* candidate_class, |
+ const IceCandidateInterface* candidate) { |
+ std::string sdp; |
+ RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp; |
+ jmethodID ctor = GetMethodID(jni, *candidate_class, "<init>", |
+ "(Ljava/lang/String;ILjava/lang/String;)V"); |
+ jstring j_mid = JavaStringFromStdString(jni, candidate->sdp_mid()); |
+ jstring j_sdp = JavaStringFromStdString(jni, sdp); |
+ jobject j_candidate = jni->NewObject(*candidate_class, ctor, j_mid, |
+ candidate->sdp_mline_index(), j_sdp); |
+ CHECK_EXCEPTION(jni) << "error during Java Candidate NewObject"; |
+ return j_candidate; |
+ } |
+ |
+ jobjectArray ToJavaCandidateArray( |
+ JNIEnv* jni, |
+ const std::vector<IceCandidateInterfaceRefPtr>& candidates) { |
+ jclass candidate_class = FindClass(jni, "org/webrtc/IceCandidate"); |
+ jobjectArray java_candidates = |
+ jni->NewObjectArray(candidates.size(), candidate_class, NULL); |
+ int i = 0; |
+ for (const auto candidate : candidates) { |
+ jobject j_candidate = |
+ ToJavaCandidate(jni, &candidate_class, candidate.get()); |
+ jni->SetObjectArrayElement(java_candidates, i++, j_candidate); |
+ } |
+ return java_candidates; |
+ } |
+ |
JNIEnv* jni() { |
return AttachCurrentThreadIfNeeded(); |
} |
@@ -1724,6 +1758,34 @@ JOW(jboolean, PeerConnection_nativeAddIceCandidate)( |
return ExtractNativePC(jni, j_pc)->AddIceCandidate(candidate.get()); |
} |
+static IceCandidateInterface* GetIceCandidateFromJava(JNIEnv* jni, |
+ jobject j_candidate) { |
+ jclass j_candidate_class = GetObjectClass(jni, j_candidate); |
+ jfieldID j_sdp_mid_id = |
+ GetFieldID(jni, j_candidate_class, "sdpMid", "Ljava/lang/String;"); |
+ std::string sdp_mid = |
+ JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_mid_id)); |
+ jfieldID j_sdp_mline_index_id = |
+ GetFieldID(jni, j_candidate_class, "sdpMLineIndex", "I"); |
+ int sdp_mline_index = GetIntField(jni, j_candidate, j_sdp_mline_index_id); |
+ jfieldID j_sdp_id = |
+ GetFieldID(jni, j_candidate_class, "sdp", "Ljava/lang/String;"); |
+ std::string sdp = |
+ JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_id)); |
+ return webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, sdp, NULL); |
+} |
+ |
+JOW(jboolean, PeerConnection_nativeRemoveIceCandidates) |
+(JNIEnv* jni, jobject j_pc, jobjectArray j_candidates) { |
+ std::vector<IceCandidateInterfaceRefPtr> candidates; |
+ size_t num_candidates = jni->GetArrayLength(j_candidates); |
+ for (size_t i = 0; i < num_candidates; ++i) { |
+ jobject j_candidate = jni->GetObjectArrayElement(j_candidates, i); |
+ candidates.push_back(GetIceCandidateFromJava(jni, j_candidate)); |
+ } |
+ return ExtractNativePC(jni, j_pc)->RemoveIceCandidates(candidates); |
+} |
+ |
JOW(jboolean, PeerConnection_nativeAddLocalStream)( |
JNIEnv* jni, jobject j_pc, jlong native_stream) { |
return ExtractNativePC(jni, j_pc)->AddStream( |