OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2013 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 #include "webrtc/api/java/jni/androidnetworkmonitor_jni.h" | 49 #include "webrtc/api/java/jni/androidnetworkmonitor_jni.h" |
50 #include "webrtc/api/java/jni/androidvideocapturer_jni.h" | 50 #include "webrtc/api/java/jni/androidvideocapturer_jni.h" |
51 #include "webrtc/api/java/jni/classreferenceholder.h" | 51 #include "webrtc/api/java/jni/classreferenceholder.h" |
52 #include "webrtc/api/java/jni/jni_helpers.h" | 52 #include "webrtc/api/java/jni/jni_helpers.h" |
53 #include "webrtc/api/java/jni/native_handle_impl.h" | 53 #include "webrtc/api/java/jni/native_handle_impl.h" |
54 #include "webrtc/api/mediaconstraintsinterface.h" | 54 #include "webrtc/api/mediaconstraintsinterface.h" |
55 #include "webrtc/api/peerconnectioninterface.h" | 55 #include "webrtc/api/peerconnectioninterface.h" |
56 #include "webrtc/api/rtpreceiverinterface.h" | 56 #include "webrtc/api/rtpreceiverinterface.h" |
57 #include "webrtc/api/rtpsenderinterface.h" | 57 #include "webrtc/api/rtpsenderinterface.h" |
58 #include "webrtc/api/videosourceinterface.h" | 58 #include "webrtc/api/videosourceinterface.h" |
| 59 #include "webrtc/api/webrtcsdp.h" |
59 #include "webrtc/base/bind.h" | 60 #include "webrtc/base/bind.h" |
60 #include "webrtc/base/checks.h" | 61 #include "webrtc/base/checks.h" |
61 #include "webrtc/base/event_tracer.h" | 62 #include "webrtc/base/event_tracer.h" |
62 #include "webrtc/base/logging.h" | 63 #include "webrtc/base/logging.h" |
63 #include "webrtc/base/logsinks.h" | 64 #include "webrtc/base/logsinks.h" |
64 #include "webrtc/base/messagequeue.h" | 65 #include "webrtc/base/messagequeue.h" |
65 #include "webrtc/base/networkmonitor.h" | 66 #include "webrtc/base/networkmonitor.h" |
66 #include "webrtc/base/ssladapter.h" | 67 #include "webrtc/base/ssladapter.h" |
67 #include "webrtc/base/stringutils.h" | 68 #include "webrtc/base/stringutils.h" |
68 #include "webrtc/media/base/videocapturer.h" | 69 #include "webrtc/media/base/videocapturer.h" |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 | 189 |
189 void OnIceCandidate(const IceCandidateInterface* candidate) override { | 190 void OnIceCandidate(const IceCandidateInterface* candidate) override { |
190 ScopedLocalRefFrame local_ref_frame(jni()); | 191 ScopedLocalRefFrame local_ref_frame(jni()); |
191 std::string sdp; | 192 std::string sdp; |
192 RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp; | 193 RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp; |
193 jclass candidate_class = FindClass(jni(), "org/webrtc/IceCandidate"); | 194 jclass candidate_class = FindClass(jni(), "org/webrtc/IceCandidate"); |
194 jmethodID ctor = GetMethodID(jni(), candidate_class, | 195 jmethodID ctor = GetMethodID(jni(), candidate_class, |
195 "<init>", "(Ljava/lang/String;ILjava/lang/String;)V"); | 196 "<init>", "(Ljava/lang/String;ILjava/lang/String;)V"); |
196 jstring j_mid = JavaStringFromStdString(jni(), candidate->sdp_mid()); | 197 jstring j_mid = JavaStringFromStdString(jni(), candidate->sdp_mid()); |
197 jstring j_sdp = JavaStringFromStdString(jni(), sdp); | 198 jstring j_sdp = JavaStringFromStdString(jni(), sdp); |
198 jobject j_candidate = jni()->NewObject( | 199 jobject j_candidate = jni()->NewObject(candidate_class, ctor, j_mid, |
199 candidate_class, ctor, j_mid, candidate->sdp_mline_index(), j_sdp); | 200 candidate->sdp_mline_index(), j_sdp); |
200 CHECK_EXCEPTION(jni()) << "error during NewObject"; | 201 CHECK_EXCEPTION(jni()) << "error during NewObject"; |
201 jmethodID m = GetMethodID(jni(), *j_observer_class_, | 202 jmethodID m = GetMethodID(jni(), *j_observer_class_, |
202 "onIceCandidate", "(Lorg/webrtc/IceCandidate;)V"); | 203 "onIceCandidate", "(Lorg/webrtc/IceCandidate;)V"); |
203 jni()->CallVoidMethod(*j_observer_global_, m, j_candidate); | 204 jni()->CallVoidMethod(*j_observer_global_, m, j_candidate); |
204 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; | 205 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
205 } | 206 } |
206 | 207 |
| 208 void OnIceCandidatesRemoved( |
| 209 const std::vector<cricket::Candidate>& candidates) { |
| 210 ScopedLocalRefFrame local_ref_frame(jni()); |
| 211 jobjectArray candidates_array = ToJavaCandidateArray(jni(), candidates); |
| 212 jmethodID m = |
| 213 GetMethodID(jni(), *j_observer_class_, "onIceCandidatesRemoved", |
| 214 "([Lorg/webrtc/IceCandidate;)V"); |
| 215 jni()->CallVoidMethod(*j_observer_global_, m, candidates_array); |
| 216 CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod"; |
| 217 } |
| 218 |
207 void OnSignalingChange( | 219 void OnSignalingChange( |
208 PeerConnectionInterface::SignalingState new_state) override { | 220 PeerConnectionInterface::SignalingState new_state) override { |
209 ScopedLocalRefFrame local_ref_frame(jni()); | 221 ScopedLocalRefFrame local_ref_frame(jni()); |
210 jmethodID m = GetMethodID( | 222 jmethodID m = GetMethodID( |
211 jni(), *j_observer_class_, "onSignalingChange", | 223 jni(), *j_observer_class_, "onSignalingChange", |
212 "(Lorg/webrtc/PeerConnection$SignalingState;)V"); | 224 "(Lorg/webrtc/PeerConnection$SignalingState;)V"); |
213 jobject new_state_enum = | 225 jobject new_state_enum = |
214 JavaEnumFromIndex(jni(), "PeerConnection$SignalingState", new_state); | 226 JavaEnumFromIndex(jni(), "PeerConnection$SignalingState", new_state); |
215 jni()->CallVoidMethod(*j_observer_global_, m, new_state_enum); | 227 jni()->CallVoidMethod(*j_observer_global_, m, new_state_enum); |
216 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; | 228 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 | 376 |
365 void DisposeRemoteStream(const NativeToJavaStreamsMap::iterator& it) { | 377 void DisposeRemoteStream(const NativeToJavaStreamsMap::iterator& it) { |
366 jobject j_stream = it->second; | 378 jobject j_stream = it->second; |
367 remote_streams_.erase(it); | 379 remote_streams_.erase(it); |
368 jni()->CallVoidMethod( | 380 jni()->CallVoidMethod( |
369 j_stream, GetMethodID(jni(), *j_media_stream_class_, "dispose", "()V")); | 381 j_stream, GetMethodID(jni(), *j_media_stream_class_, "dispose", "()V")); |
370 CHECK_EXCEPTION(jni()) << "error during MediaStream.dispose()"; | 382 CHECK_EXCEPTION(jni()) << "error during MediaStream.dispose()"; |
371 DeleteGlobalRef(jni(), j_stream); | 383 DeleteGlobalRef(jni(), j_stream); |
372 } | 384 } |
373 | 385 |
| 386 jobject ToJavaCandidate(JNIEnv* jni, |
| 387 jclass* candidate_class, |
| 388 const cricket::Candidate& candidate) { |
| 389 std::string sdp = webrtc::SdpSerializeCandidate(candidate); |
| 390 RTC_CHECK(!sdp.empty()) << "got an empty ICE candidate"; |
| 391 jmethodID ctor = GetMethodID(jni, *candidate_class, "<init>", |
| 392 "(Ljava/lang/String;ILjava/lang/String;)V"); |
| 393 jstring j_mid = JavaStringFromStdString(jni, candidate.transport_name()); |
| 394 jstring j_sdp = JavaStringFromStdString(jni, sdp); |
| 395 // sdp_mline_index is not used, pass an invalid value -1. |
| 396 jobject j_candidate = |
| 397 jni->NewObject(*candidate_class, ctor, j_mid, -1, j_sdp); |
| 398 CHECK_EXCEPTION(jni) << "error during Java Candidate NewObject"; |
| 399 return j_candidate; |
| 400 } |
| 401 |
| 402 jobjectArray ToJavaCandidateArray( |
| 403 JNIEnv* jni, |
| 404 const std::vector<cricket::Candidate>& candidates) { |
| 405 jclass candidate_class = FindClass(jni, "org/webrtc/IceCandidate"); |
| 406 jobjectArray java_candidates = |
| 407 jni->NewObjectArray(candidates.size(), candidate_class, NULL); |
| 408 int i = 0; |
| 409 for (const cricket::Candidate& candidate : candidates) { |
| 410 jobject j_candidate = ToJavaCandidate(jni, &candidate_class, candidate); |
| 411 jni->SetObjectArrayElement(java_candidates, i++, j_candidate); |
| 412 } |
| 413 return java_candidates; |
| 414 } |
| 415 |
374 JNIEnv* jni() { | 416 JNIEnv* jni() { |
375 return AttachCurrentThreadIfNeeded(); | 417 return AttachCurrentThreadIfNeeded(); |
376 } | 418 } |
377 | 419 |
378 const ScopedGlobalRef<jobject> j_observer_global_; | 420 const ScopedGlobalRef<jobject> j_observer_global_; |
379 const ScopedGlobalRef<jclass> j_observer_class_; | 421 const ScopedGlobalRef<jclass> j_observer_class_; |
380 const ScopedGlobalRef<jclass> j_media_stream_class_; | 422 const ScopedGlobalRef<jclass> j_media_stream_class_; |
381 const jmethodID j_media_stream_ctor_; | 423 const jmethodID j_media_stream_ctor_; |
382 const ScopedGlobalRef<jclass> j_audio_track_class_; | 424 const ScopedGlobalRef<jclass> j_audio_track_class_; |
383 const jmethodID j_audio_track_ctor_; | 425 const jmethodID j_audio_track_ctor_; |
(...skipping 1332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1716 JOW(jboolean, PeerConnection_nativeAddIceCandidate)( | 1758 JOW(jboolean, PeerConnection_nativeAddIceCandidate)( |
1717 JNIEnv* jni, jobject j_pc, jstring j_sdp_mid, | 1759 JNIEnv* jni, jobject j_pc, jstring j_sdp_mid, |
1718 jint j_sdp_mline_index, jstring j_candidate_sdp) { | 1760 jint j_sdp_mline_index, jstring j_candidate_sdp) { |
1719 std::string sdp_mid = JavaToStdString(jni, j_sdp_mid); | 1761 std::string sdp_mid = JavaToStdString(jni, j_sdp_mid); |
1720 std::string sdp = JavaToStdString(jni, j_candidate_sdp); | 1762 std::string sdp = JavaToStdString(jni, j_candidate_sdp); |
1721 scoped_ptr<IceCandidateInterface> candidate( | 1763 scoped_ptr<IceCandidateInterface> candidate( |
1722 webrtc::CreateIceCandidate(sdp_mid, j_sdp_mline_index, sdp, NULL)); | 1764 webrtc::CreateIceCandidate(sdp_mid, j_sdp_mline_index, sdp, NULL)); |
1723 return ExtractNativePC(jni, j_pc)->AddIceCandidate(candidate.get()); | 1765 return ExtractNativePC(jni, j_pc)->AddIceCandidate(candidate.get()); |
1724 } | 1766 } |
1725 | 1767 |
| 1768 static cricket::Candidate GetCandidateFromJava(JNIEnv* jni, |
| 1769 jobject j_candidate) { |
| 1770 jclass j_candidate_class = GetObjectClass(jni, j_candidate); |
| 1771 jfieldID j_sdp_mid_id = |
| 1772 GetFieldID(jni, j_candidate_class, "sdpMid", "Ljava/lang/String;"); |
| 1773 std::string sdp_mid = |
| 1774 JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_mid_id)); |
| 1775 jfieldID j_sdp_id = |
| 1776 GetFieldID(jni, j_candidate_class, "sdp", "Ljava/lang/String;"); |
| 1777 std::string sdp = |
| 1778 JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_id)); |
| 1779 cricket::Candidate candidate; |
| 1780 if (!webrtc::SdpDeserializeCandidate(sdp_mid, sdp, &candidate, NULL)) { |
| 1781 LOG(LS_ERROR) << "SdpDescrializeCandidate failed with sdp " << sdp; |
| 1782 } |
| 1783 return candidate; |
| 1784 } |
| 1785 |
| 1786 JOW(jboolean, PeerConnection_nativeRemoveIceCandidates) |
| 1787 (JNIEnv* jni, jobject j_pc, jobjectArray j_candidates) { |
| 1788 std::vector<cricket::Candidate> candidates; |
| 1789 size_t num_candidates = jni->GetArrayLength(j_candidates); |
| 1790 for (size_t i = 0; i < num_candidates; ++i) { |
| 1791 jobject j_candidate = jni->GetObjectArrayElement(j_candidates, i); |
| 1792 candidates.push_back(GetCandidateFromJava(jni, j_candidate)); |
| 1793 } |
| 1794 return ExtractNativePC(jni, j_pc)->RemoveIceCandidates(candidates); |
| 1795 } |
| 1796 |
1726 JOW(jboolean, PeerConnection_nativeAddLocalStream)( | 1797 JOW(jboolean, PeerConnection_nativeAddLocalStream)( |
1727 JNIEnv* jni, jobject j_pc, jlong native_stream) { | 1798 JNIEnv* jni, jobject j_pc, jlong native_stream) { |
1728 return ExtractNativePC(jni, j_pc)->AddStream( | 1799 return ExtractNativePC(jni, j_pc)->AddStream( |
1729 reinterpret_cast<MediaStreamInterface*>(native_stream)); | 1800 reinterpret_cast<MediaStreamInterface*>(native_stream)); |
1730 } | 1801 } |
1731 | 1802 |
1732 JOW(void, PeerConnection_nativeRemoveLocalStream)( | 1803 JOW(void, PeerConnection_nativeRemoveLocalStream)( |
1733 JNIEnv* jni, jobject j_pc, jlong native_stream) { | 1804 JNIEnv* jni, jobject j_pc, jlong native_stream) { |
1734 ExtractNativePC(jni, j_pc)->RemoveStream( | 1805 ExtractNativePC(jni, j_pc)->RemoveStream( |
1735 reinterpret_cast<MediaStreamInterface*>(native_stream)); | 1806 reinterpret_cast<MediaStreamInterface*>(native_stream)); |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2038 return JavaStringFromStdString( | 2109 return JavaStringFromStdString( |
2039 jni, | 2110 jni, |
2040 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id()); | 2111 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id()); |
2041 } | 2112 } |
2042 | 2113 |
2043 JOW(void, RtpReceiver_free)(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) { | 2114 JOW(void, RtpReceiver_free)(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) { |
2044 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->Release(); | 2115 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->Release(); |
2045 } | 2116 } |
2046 | 2117 |
2047 } // namespace webrtc_jni | 2118 } // namespace webrtc_jni |
OLD | NEW |