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