Skip to content

Commit c9c6578

Browse files
committed
Refactor JNI_PeetConnectionFactory for readability and use unique ptrs for threads
Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>
1 parent 24f4922 commit c9c6578

2 files changed

Lines changed: 66 additions & 69 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=1.0.2
1+
version=1.0.3

webrtc-jni/src/main/cpp/src/JNI_PeerConnectionFactory.cpp

Lines changed: 65 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -26,44 +26,42 @@
2626
JNIEXPORT void JNICALL Java_dev_kastle_webrtc_PeerConnectionFactory_initialize
2727
(JNIEnv * env, jobject caller)
2828
{
29-
try {
30-
auto networkThread = webrtc::Thread::CreateWithSocketServer();
31-
networkThread->SetName("webrtc_jni_network_thread", nullptr);
32-
33-
auto signalingThread = webrtc::Thread::Create();
34-
signalingThread->SetName("webrtc_jni_signaling_thread", nullptr);
35-
36-
auto workerThread = webrtc::Thread::Create();
37-
workerThread->SetName("webrtc_jni_worker_thread", nullptr);
38-
39-
if (!networkThread->Start()) {
40-
throw jni::Exception("Start network thread failed");
41-
}
42-
if (!signalingThread->Start()) {
43-
throw jni::Exception("Start signaling thread failed");
44-
}
45-
if (!workerThread->Start()) {
46-
throw jni::Exception("Start worker thread failed");
47-
}
48-
49-
webrtc::PeerConnectionFactoryDependencies dependencies;
50-
51-
dependencies.network_thread = networkThread.release();
52-
dependencies.worker_thread = workerThread.release();
53-
dependencies.signaling_thread = signalingThread.release();
54-
55-
auto factory = webrtc::CreateModularPeerConnectionFactory(std::move(dependencies));
56-
57-
if (factory != nullptr) {
58-
SetHandle(env, caller, factory.release());
59-
}
60-
else {
61-
throw jni::Exception("Create PeerConnectionFactory failed");
62-
}
63-
}
64-
catch (...) {
65-
ThrowCxxJavaException(env);
66-
}
29+
std::unique_ptr<webrtc::Thread> networkThread = webrtc::Thread::CreateWithSocketServer();
30+
networkThread->SetName("webrtc_jni_network_thread", nullptr);
31+
if (!networkThread->Start()) {
32+
env->Throw(jni::JavaRuntimeException(env, "Start network thread failed"));
33+
return;
34+
}
35+
36+
std::unique_ptr<webrtc::Thread> signalingThread = webrtc::Thread::Create();
37+
signalingThread->SetName("webrtc_jni_signaling_thread", nullptr);
38+
if (!signalingThread->Start()) {
39+
env->Throw(jni::JavaRuntimeException(env, "Start signaling thread failed"));
40+
return;
41+
}
42+
43+
std::unique_ptr<webrtc::Thread> workerThread = webrtc::Thread::Create();
44+
workerThread->SetName("webrtc_jni_worker_thread", nullptr);
45+
if (!workerThread->Start()) {
46+
env->Throw(jni::JavaRuntimeException(env, "Start worker thread failed"));
47+
return;
48+
}
49+
50+
webrtc::PeerConnectionFactoryDependencies dependencies;
51+
52+
dependencies.network_thread = networkThread.release();
53+
dependencies.worker_thread = workerThread.release();
54+
dependencies.signaling_thread = signalingThread.release();
55+
56+
webrtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> factory =
57+
webrtc::CreateModularPeerConnectionFactory(std::move(dependencies));
58+
59+
if (factory == nullptr) {
60+
env->Throw(jni::JavaRuntimeException(env, "Create PeerConnectionFactory failed"));
61+
return;
62+
}
63+
64+
SetHandle(env, caller, factory.release());
6765
}
6866

6967
JNIEXPORT void JNICALL Java_dev_kastle_webrtc_PeerConnectionFactory_dispose
@@ -72,37 +70,31 @@ JNIEXPORT void JNICALL Java_dev_kastle_webrtc_PeerConnectionFactory_dispose
7270
webrtc::PeerConnectionFactoryInterface * factory = GetHandle<webrtc::PeerConnectionFactoryInterface>(env, caller);
7371
CHECK_HANDLE(factory);
7472

75-
webrtc::Thread * networkThread = GetHandle<webrtc::Thread>(env, caller, "networkThreadHandle");
76-
webrtc::Thread * signalingThread = GetHandle<webrtc::Thread>(env, caller, "signalingThreadHandle");
77-
webrtc::Thread * workerThread = GetHandle<webrtc::Thread>(env, caller, "workerThreadHandle");
73+
std::unique_ptr<webrtc::Thread> networkThread(GetHandle<webrtc::Thread>(env, caller, "networkThreadHandle"));
74+
std::unique_ptr<webrtc::Thread> signalingThread(GetHandle<webrtc::Thread>(env, caller, "signalingThreadHandle"));
75+
std::unique_ptr<webrtc::Thread> workerThread(GetHandle<webrtc::Thread>(env, caller, "workerThreadHandle"));
7876

7977
webrtc::RefCountReleaseStatus status = factory->Release();
8078

8179
if (status != webrtc::RefCountReleaseStatus::kDroppedLastRef) {
82-
env->Throw(jni::JavaError(env, "Native object was not deleted. A reference is still around somewhere."));
80+
env->Throw(jni::JavaError(
81+
env,
82+
"Native object was not deleted. A reference is still around somewhere."
83+
));
8384
}
8485

8586
SetHandle<std::nullptr_t>(env, caller, nullptr);
86-
8787
factory = nullptr;
8888

89-
try {
90-
if (networkThread) {
91-
networkThread->Stop();
92-
delete networkThread;
93-
}
94-
if (signalingThread) {
95-
signalingThread->Stop();
96-
delete signalingThread;
97-
}
98-
if (workerThread) {
99-
workerThread->Stop();
100-
delete workerThread;
101-
}
102-
}
103-
catch (...) {
104-
ThrowCxxJavaException(env);
105-
}
89+
if (networkThread) {
90+
networkThread->Stop();
91+
}
92+
if (signalingThread) {
93+
signalingThread->Stop();
94+
}
95+
if (workerThread) {
96+
workerThread->Stop();
97+
}
10698
}
10799

108100
JNIEXPORT jobject JNICALL Java_dev_kastle_webrtc_PeerConnectionFactory_createPeerConnection
@@ -117,14 +109,20 @@ JNIEXPORT jobject JNICALL Java_dev_kastle_webrtc_PeerConnectionFactory_createPee
117109
return nullptr;
118110
}
119111

120-
webrtc::PeerConnectionFactoryInterface * factory = GetHandle<webrtc::PeerConnectionFactoryInterface>(env, caller);
112+
webrtc::PeerConnectionFactoryInterface * factory =
113+
GetHandle<webrtc::PeerConnectionFactoryInterface>(env, caller);
121114
CHECK_HANDLEV(factory, nullptr);
122115

123-
webrtc::PeerConnectionInterface::RTCConfiguration configuration = jni::RTCConfiguration::toNative(env, jni::JavaLocalRef<jobject>(env, jConfig));
124-
webrtc::PeerConnectionObserver * observer = new jni::PeerConnectionObserver(env, jni::JavaGlobalRef<jobject>(env, jobserver));
116+
webrtc::PeerConnectionInterface::RTCConfiguration configuration =
117+
jni::RTCConfiguration::toNative(env, jni::JavaLocalRef<jobject>(env, jConfig));
118+
119+
webrtc::PeerConnectionObserver * observer =
120+
new jni::PeerConnectionObserver(env, jni::JavaGlobalRef<jobject>(env, jobserver));
121+
125122
webrtc::PeerConnectionDependencies dependencies(observer);
126123

127-
auto result = factory->CreatePeerConnectionOrError(configuration, std::move(dependencies));
124+
webrtc::RTCErrorOr<webrtc::scoped_refptr<webrtc::PeerConnectionInterface>> result =
125+
factory->CreatePeerConnectionOrError(configuration, std::move(dependencies));
128126

129127
if (!result.ok()) {
130128
env->Throw(jni::JavaRuntimeException(env, "Create PeerConnection failed: %s %s",
@@ -133,13 +131,12 @@ JNIEXPORT jobject JNICALL Java_dev_kastle_webrtc_PeerConnectionFactory_createPee
133131
return nullptr;
134132
}
135133

136-
auto pc = result.MoveValue();
134+
webrtc::scoped_refptr<webrtc::PeerConnectionInterface> pc = result.MoveValue();
137135

138136
if (pc != nullptr) {
139-
auto javaPeerConnection = jni::JavaFactories::create(env, pc.release());
140-
137+
jni::JavaLocalRef<jobject> javaPeerConnection =
138+
jni::JavaFactories::create(env, pc.release());
141139
SetHandle(env, javaPeerConnection.get(), "observerHandle", observer);
142-
143140
return javaPeerConnection.release();
144141
}
145142

0 commit comments

Comments
 (0)