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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 using rtc::scoped_ptr; | 84 using rtc::scoped_ptr; |
85 using webrtc::AudioSourceInterface; | 85 using webrtc::AudioSourceInterface; |
86 using webrtc::AudioTrackInterface; | 86 using webrtc::AudioTrackInterface; |
87 using webrtc::AudioTrackVector; | 87 using webrtc::AudioTrackVector; |
88 using webrtc::CreateSessionDescriptionObserver; | 88 using webrtc::CreateSessionDescriptionObserver; |
89 using webrtc::DataBuffer; | 89 using webrtc::DataBuffer; |
90 using webrtc::DataChannelInit; | 90 using webrtc::DataChannelInit; |
91 using webrtc::DataChannelInterface; | 91 using webrtc::DataChannelInterface; |
92 using webrtc::DataChannelObserver; | 92 using webrtc::DataChannelObserver; |
93 using webrtc::IceCandidateInterface; | 93 using webrtc::IceCandidateInterface; |
| 94 using webrtc::IceCandidateInterfaceRefPtr; |
94 using webrtc::LogcatTraceContext; | 95 using webrtc::LogcatTraceContext; |
95 using webrtc::MediaConstraintsInterface; | 96 using webrtc::MediaConstraintsInterface; |
96 using webrtc::MediaSourceInterface; | 97 using webrtc::MediaSourceInterface; |
97 using webrtc::MediaStreamInterface; | 98 using webrtc::MediaStreamInterface; |
98 using webrtc::MediaStreamTrackInterface; | 99 using webrtc::MediaStreamTrackInterface; |
99 using webrtc::PeerConnectionFactoryInterface; | 100 using webrtc::PeerConnectionFactoryInterface; |
100 using webrtc::PeerConnectionInterface; | 101 using webrtc::PeerConnectionInterface; |
101 using webrtc::PeerConnectionObserver; | 102 using webrtc::PeerConnectionObserver; |
102 using webrtc::RtpReceiverInterface; | 103 using webrtc::RtpReceiverInterface; |
103 using webrtc::RtpSenderInterface; | 104 using webrtc::RtpSenderInterface; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 } | 182 } |
182 | 183 |
183 virtual ~PCOJava() { | 184 virtual ~PCOJava() { |
184 ScopedLocalRefFrame local_ref_frame(jni()); | 185 ScopedLocalRefFrame local_ref_frame(jni()); |
185 while (!remote_streams_.empty()) | 186 while (!remote_streams_.empty()) |
186 DisposeRemoteStream(remote_streams_.begin()); | 187 DisposeRemoteStream(remote_streams_.begin()); |
187 } | 188 } |
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 RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp; | |
193 jclass candidate_class = FindClass(jni(), "org/webrtc/IceCandidate"); | 192 jclass candidate_class = FindClass(jni(), "org/webrtc/IceCandidate"); |
194 jmethodID ctor = GetMethodID(jni(), candidate_class, | 193 jobject j_candidate = ToJavaCandidate(jni(), &candidate_class, candidate); |
195 "<init>", "(Ljava/lang/String;ILjava/lang/String;)V"); | |
196 jstring j_mid = JavaStringFromStdString(jni(), candidate->sdp_mid()); | |
197 jstring j_sdp = JavaStringFromStdString(jni(), sdp); | |
198 jobject j_candidate = jni()->NewObject( | |
199 candidate_class, ctor, j_mid, candidate->sdp_mline_index(), j_sdp); | |
200 CHECK_EXCEPTION(jni()) << "error during NewObject"; | |
201 jmethodID m = GetMethodID(jni(), *j_observer_class_, | 194 jmethodID m = GetMethodID(jni(), *j_observer_class_, |
202 "onIceCandidate", "(Lorg/webrtc/IceCandidate;)V"); | 195 "onIceCandidate", "(Lorg/webrtc/IceCandidate;)V"); |
203 jni()->CallVoidMethod(*j_observer_global_, m, j_candidate); | 196 jni()->CallVoidMethod(*j_observer_global_, m, j_candidate); |
204 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; | 197 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
205 } | 198 } |
206 | 199 |
| 200 void OnIceCandidatesRemoved( |
| 201 const std::vector<IceCandidateInterfaceRefPtr>& candidates) { |
| 202 ScopedLocalRefFrame local_ref_frame(jni()); |
| 203 jobjectArray candidates_array = ToJavaCandidateArray(jni(), candidates); |
| 204 jmethodID m = |
| 205 GetMethodID(jni(), *j_observer_class_, "onIceCandidatesRemoved", |
| 206 "([Lorg/webrtc/IceCandidate;)V"); |
| 207 jni()->CallVoidMethod(*j_observer_global_, m, candidates_array); |
| 208 CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod"; |
| 209 } |
| 210 |
207 void OnSignalingChange( | 211 void OnSignalingChange( |
208 PeerConnectionInterface::SignalingState new_state) override { | 212 PeerConnectionInterface::SignalingState new_state) override { |
209 ScopedLocalRefFrame local_ref_frame(jni()); | 213 ScopedLocalRefFrame local_ref_frame(jni()); |
210 jmethodID m = GetMethodID( | 214 jmethodID m = GetMethodID( |
211 jni(), *j_observer_class_, "onSignalingChange", | 215 jni(), *j_observer_class_, "onSignalingChange", |
212 "(Lorg/webrtc/PeerConnection$SignalingState;)V"); | 216 "(Lorg/webrtc/PeerConnection$SignalingState;)V"); |
213 jobject new_state_enum = | 217 jobject new_state_enum = |
214 JavaEnumFromIndex(jni(), "PeerConnection$SignalingState", new_state); | 218 JavaEnumFromIndex(jni(), "PeerConnection$SignalingState", new_state); |
215 jni()->CallVoidMethod(*j_observer_global_, m, new_state_enum); | 219 jni()->CallVoidMethod(*j_observer_global_, m, new_state_enum); |
216 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; | 220 CHECK_EXCEPTION(jni()) << "error during CallVoidMethod"; |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
364 | 368 |
365 void DisposeRemoteStream(const NativeToJavaStreamsMap::iterator& it) { | 369 void DisposeRemoteStream(const NativeToJavaStreamsMap::iterator& it) { |
366 jobject j_stream = it->second; | 370 jobject j_stream = it->second; |
367 remote_streams_.erase(it); | 371 remote_streams_.erase(it); |
368 jni()->CallVoidMethod( | 372 jni()->CallVoidMethod( |
369 j_stream, GetMethodID(jni(), *j_media_stream_class_, "dispose", "()V")); | 373 j_stream, GetMethodID(jni(), *j_media_stream_class_, "dispose", "()V")); |
370 CHECK_EXCEPTION(jni()) << "error during MediaStream.dispose()"; | 374 CHECK_EXCEPTION(jni()) << "error during MediaStream.dispose()"; |
371 DeleteGlobalRef(jni(), j_stream); | 375 DeleteGlobalRef(jni(), j_stream); |
372 } | 376 } |
373 | 377 |
| 378 jobject ToJavaCandidate(JNIEnv* jni, |
| 379 jclass* candidate_class, |
| 380 const IceCandidateInterface* candidate) { |
| 381 std::string sdp; |
| 382 RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp; |
| 383 jmethodID ctor = GetMethodID(jni, *candidate_class, "<init>", |
| 384 "(Ljava/lang/String;ILjava/lang/String;)V"); |
| 385 jstring j_mid = JavaStringFromStdString(jni, candidate->sdp_mid()); |
| 386 jstring j_sdp = JavaStringFromStdString(jni, sdp); |
| 387 jobject j_candidate = jni->NewObject(*candidate_class, ctor, j_mid, |
| 388 candidate->sdp_mline_index(), j_sdp); |
| 389 CHECK_EXCEPTION(jni) << "error during Java Candidate NewObject"; |
| 390 return j_candidate; |
| 391 } |
| 392 |
| 393 jobjectArray ToJavaCandidateArray( |
| 394 JNIEnv* jni, |
| 395 const std::vector<IceCandidateInterfaceRefPtr>& candidates) { |
| 396 jclass candidate_class = FindClass(jni, "org/webrtc/IceCandidate"); |
| 397 jobjectArray java_candidates = |
| 398 jni->NewObjectArray(candidates.size(), candidate_class, NULL); |
| 399 int i = 0; |
| 400 for (const auto candidate : candidates) { |
| 401 jobject j_candidate = |
| 402 ToJavaCandidate(jni, &candidate_class, candidate.get()); |
| 403 jni->SetObjectArrayElement(java_candidates, i++, j_candidate); |
| 404 } |
| 405 return java_candidates; |
| 406 } |
| 407 |
374 JNIEnv* jni() { | 408 JNIEnv* jni() { |
375 return AttachCurrentThreadIfNeeded(); | 409 return AttachCurrentThreadIfNeeded(); |
376 } | 410 } |
377 | 411 |
378 const ScopedGlobalRef<jobject> j_observer_global_; | 412 const ScopedGlobalRef<jobject> j_observer_global_; |
379 const ScopedGlobalRef<jclass> j_observer_class_; | 413 const ScopedGlobalRef<jclass> j_observer_class_; |
380 const ScopedGlobalRef<jclass> j_media_stream_class_; | 414 const ScopedGlobalRef<jclass> j_media_stream_class_; |
381 const jmethodID j_media_stream_ctor_; | 415 const jmethodID j_media_stream_ctor_; |
382 const ScopedGlobalRef<jclass> j_audio_track_class_; | 416 const ScopedGlobalRef<jclass> j_audio_track_class_; |
383 const jmethodID j_audio_track_ctor_; | 417 const jmethodID j_audio_track_ctor_; |
(...skipping 1333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1717 JOW(jboolean, PeerConnection_nativeAddIceCandidate)( | 1751 JOW(jboolean, PeerConnection_nativeAddIceCandidate)( |
1718 JNIEnv* jni, jobject j_pc, jstring j_sdp_mid, | 1752 JNIEnv* jni, jobject j_pc, jstring j_sdp_mid, |
1719 jint j_sdp_mline_index, jstring j_candidate_sdp) { | 1753 jint j_sdp_mline_index, jstring j_candidate_sdp) { |
1720 std::string sdp_mid = JavaToStdString(jni, j_sdp_mid); | 1754 std::string sdp_mid = JavaToStdString(jni, j_sdp_mid); |
1721 std::string sdp = JavaToStdString(jni, j_candidate_sdp); | 1755 std::string sdp = JavaToStdString(jni, j_candidate_sdp); |
1722 scoped_ptr<IceCandidateInterface> candidate( | 1756 scoped_ptr<IceCandidateInterface> candidate( |
1723 webrtc::CreateIceCandidate(sdp_mid, j_sdp_mline_index, sdp, NULL)); | 1757 webrtc::CreateIceCandidate(sdp_mid, j_sdp_mline_index, sdp, NULL)); |
1724 return ExtractNativePC(jni, j_pc)->AddIceCandidate(candidate.get()); | 1758 return ExtractNativePC(jni, j_pc)->AddIceCandidate(candidate.get()); |
1725 } | 1759 } |
1726 | 1760 |
| 1761 static IceCandidateInterface* GetIceCandidateFromJava(JNIEnv* jni, |
| 1762 jobject j_candidate) { |
| 1763 jclass j_candidate_class = GetObjectClass(jni, j_candidate); |
| 1764 jfieldID j_sdp_mid_id = |
| 1765 GetFieldID(jni, j_candidate_class, "sdpMid", "Ljava/lang/String;"); |
| 1766 std::string sdp_mid = |
| 1767 JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_mid_id)); |
| 1768 jfieldID j_sdp_mline_index_id = |
| 1769 GetFieldID(jni, j_candidate_class, "sdpMLineIndex", "I"); |
| 1770 int sdp_mline_index = GetIntField(jni, j_candidate, j_sdp_mline_index_id); |
| 1771 jfieldID j_sdp_id = |
| 1772 GetFieldID(jni, j_candidate_class, "sdp", "Ljava/lang/String;"); |
| 1773 std::string sdp = |
| 1774 JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_id)); |
| 1775 return webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, sdp, NULL); |
| 1776 } |
| 1777 |
| 1778 JOW(jboolean, PeerConnection_nativeRemoveIceCandidates) |
| 1779 (JNIEnv* jni, jobject j_pc, jobjectArray j_candidates) { |
| 1780 std::vector<IceCandidateInterfaceRefPtr> candidates; |
| 1781 size_t num_candidates = jni->GetArrayLength(j_candidates); |
| 1782 for (size_t i = 0; i < num_candidates; ++i) { |
| 1783 jobject j_candidate = jni->GetObjectArrayElement(j_candidates, i); |
| 1784 candidates.push_back(GetIceCandidateFromJava(jni, j_candidate)); |
| 1785 } |
| 1786 return ExtractNativePC(jni, j_pc)->RemoveIceCandidates(candidates); |
| 1787 } |
| 1788 |
1727 JOW(jboolean, PeerConnection_nativeAddLocalStream)( | 1789 JOW(jboolean, PeerConnection_nativeAddLocalStream)( |
1728 JNIEnv* jni, jobject j_pc, jlong native_stream) { | 1790 JNIEnv* jni, jobject j_pc, jlong native_stream) { |
1729 return ExtractNativePC(jni, j_pc)->AddStream( | 1791 return ExtractNativePC(jni, j_pc)->AddStream( |
1730 reinterpret_cast<MediaStreamInterface*>(native_stream)); | 1792 reinterpret_cast<MediaStreamInterface*>(native_stream)); |
1731 } | 1793 } |
1732 | 1794 |
1733 JOW(void, PeerConnection_nativeRemoveLocalStream)( | 1795 JOW(void, PeerConnection_nativeRemoveLocalStream)( |
1734 JNIEnv* jni, jobject j_pc, jlong native_stream) { | 1796 JNIEnv* jni, jobject j_pc, jlong native_stream) { |
1735 ExtractNativePC(jni, j_pc)->RemoveStream( | 1797 ExtractNativePC(jni, j_pc)->RemoveStream( |
1736 reinterpret_cast<MediaStreamInterface*>(native_stream)); | 1798 reinterpret_cast<MediaStreamInterface*>(native_stream)); |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2039 return JavaStringFromStdString( | 2101 return JavaStringFromStdString( |
2040 jni, | 2102 jni, |
2041 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id()); | 2103 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id()); |
2042 } | 2104 } |
2043 | 2105 |
2044 JOW(void, RtpReceiver_free)(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) { | 2106 JOW(void, RtpReceiver_free)(JNIEnv* jni, jclass, jlong j_rtp_receiver_pointer) { |
2045 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->Release(); | 2107 reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->Release(); |
2046 } | 2108 } |
2047 | 2109 |
2048 } // namespace webrtc_jni | 2110 } // namespace webrtc_jni |
OLD | NEW |