| 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(
|
|
|