Index: talk/app/webrtc/java/jni/peerconnection_jni.cc |
diff --git a/talk/app/webrtc/java/jni/peerconnection_jni.cc b/talk/app/webrtc/java/jni/peerconnection_jni.cc |
index 5fa1617644d048e0933c947a5e8002fa63b6c970..d33af8fa1301677bee3c06850d6fdafcd67d1d97 100644 |
--- a/talk/app/webrtc/java/jni/peerconnection_jni.cc |
+++ b/talk/app/webrtc/java/jni/peerconnection_jni.cc |
@@ -1071,8 +1071,11 @@ class OwnedFactoryAndThreads { |
PeerConnectionFactoryInterface* factory() { return factory_; } |
WebRtcVideoEncoderFactory* encoder_factory() { return encoder_factory_; } |
WebRtcVideoDecoderFactory* decoder_factory() { return decoder_factory_; } |
+ void InvokeJavaCallbacksOnFactoryThreads(); |
private: |
+ void JavaCallbackOnFactoryThreads(); |
+ |
const scoped_ptr<Thread> worker_thread_; |
const scoped_ptr<Thread> signaling_thread_; |
WebRtcVideoEncoderFactory* encoder_factory_; |
@@ -1080,6 +1083,34 @@ class OwnedFactoryAndThreads { |
PeerConnectionFactoryInterface* factory_; // Const after ctor except dtor. |
}; |
+void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() { |
+ JNIEnv* jni = AttachCurrentThreadIfNeeded(); |
+ ScopedLocalRefFrame local_ref_frame(jni); |
+ jclass j_factory_class = FindClass(jni, "org/webrtc/PeerConnectionFactory"); |
+ jmethodID m = nullptr; |
+ if (Thread::Current() == worker_thread_) { |
+ LOG(LS_INFO) << "Worker thread JavaCallback"; |
+ m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V"); |
+ } |
+ if (Thread::Current() == signaling_thread_) { |
+ LOG(LS_INFO) << "Signaling thread JavaCallback"; |
+ m = GetStaticMethodID( |
+ jni, j_factory_class, "onSignalingThreadReady", "()V"); |
+ } |
+ if (m != nullptr) { |
+ jni->CallStaticVoidMethod(j_factory_class, m); |
+ CHECK_EXCEPTION(jni) << "error during JavaCallback::CallStaticVoidMethod"; |
+ } |
+} |
+ |
+void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() { |
+ LOG(LS_INFO) << "InvokeJavaCallbacksOnFactoryThreads."; |
+ worker_thread_->Invoke<void>( |
+ Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this)); |
+ signaling_thread_->Invoke<void>( |
+ Bind(&OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads, this)); |
+} |
+ |
JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( |
JNIEnv* jni, jclass) { |
// talk/ assumes pretty widely that the current Thread is ThreadManager'd, but |
@@ -1115,10 +1146,11 @@ JOW(jlong, PeerConnectionFactory_nativeCreatePeerConnectionFactory)( |
worker_thread, signaling_thread, |
encoder_factory, decoder_factory, |
factory.release()); |
+ owned_factory->InvokeJavaCallbacksOnFactoryThreads(); |
return jlongFromPointer(owned_factory); |
} |
-JOW(void, PeerConnectionFactory_freeFactory)(JNIEnv*, jclass, jlong j_p) { |
+JOW(void, PeerConnectionFactory_nativeFreeFactory)(JNIEnv*, jclass, jlong j_p) { |
delete reinterpret_cast<OwnedFactoryAndThreads*>(j_p); |
if (field_trials_init_string) { |
webrtc::field_trial::InitFieldTrialsFromString(NULL); |
@@ -1132,6 +1164,13 @@ static PeerConnectionFactoryInterface* factoryFromJava(jlong j_p) { |
return reinterpret_cast<OwnedFactoryAndThreads*>(j_p)->factory(); |
} |
+JOW(void, PeerConnectionFactory_nativeThreadsCallbacks)( |
+ JNIEnv*, jclass, jlong j_p) { |
+ OwnedFactoryAndThreads *factory = |
+ reinterpret_cast<OwnedFactoryAndThreads*>(j_p); |
+ factory->InvokeJavaCallbacksOnFactoryThreads(); |
+} |
+ |
JOW(jlong, PeerConnectionFactory_nativeCreateLocalMediaStream)( |
JNIEnv* jni, jclass, jlong native_factory, jstring label) { |
rtc::scoped_refptr<PeerConnectionFactoryInterface> factory( |