@@ -73,7 +73,6 @@ class JavaObject {
73
73
struct InstanceHolder {
74
74
std::unique_ptr<Instance> nativeInstance;
75
75
std::unique_ptr<GroupInstanceImpl> groupNativeInstance;
76
- jobject javaInstance;
77
76
std::shared_ptr<tgcalls::VideoCaptureInterface> _videoCapture;
78
77
std::shared_ptr<PlatformContext> _platformContext;
79
78
};
@@ -254,17 +253,17 @@ void initWebRTC(JNIEnv *env) {
254
253
JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_makeGroupNativeInstance (JNIEnv *env, jclass clazz, jobject instanceObj, jboolean highQuality) {
255
254
initWebRTC (env);
256
255
257
- jobject globalRef = env->NewGlobalRef (instanceObj);
258
- std::shared_ptr<PlatformContext> platformContext = std::make_shared<AndroidContext>(env);
256
+ std::shared_ptr<PlatformContext> platformContext = std::make_shared<AndroidContext>(env, instanceObj);
259
257
260
258
GroupInstanceDescriptor descriptor = {
261
- .networkStateUpdated = [globalRef](bool state) {
262
- tgvoip::jni::DoWithJNI ([globalRef, state](JNIEnv *env) {
259
+ .networkStateUpdated = [platformContext](bool state) {
260
+ tgvoip::jni::DoWithJNI ([platformContext, state](JNIEnv *env) {
261
+ jobject globalRef = ((AndroidContext *) platformContext.get ())->getJavaInstance ();
263
262
env->CallVoidMethod (globalRef, env->GetMethodID (NativeInstanceClass, " onNetworkStateUpdated" , " (Z)V" ), state);
264
263
});
265
264
},
266
- .audioLevelsUpdated = [globalRef ](GroupLevelsUpdate const &update) {
267
- tgvoip::jni::DoWithJNI ([globalRef , update](JNIEnv *env) {
265
+ .audioLevelsUpdated = [platformContext ](GroupLevelsUpdate const &update) {
266
+ tgvoip::jni::DoWithJNI ([platformContext , update](JNIEnv *env) {
268
267
unsigned int size = update.updates .size ();
269
268
jintArray intArray = env->NewIntArray (size);
270
269
jfloatArray floatArray = env->NewFloatArray (size);
@@ -282,6 +281,7 @@ JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_makeGrou
282
281
env->SetFloatArrayRegion (floatArray, 0 , size, floatFill);
283
282
env->SetBooleanArrayRegion (boolArray, 0 , size, boolFill);
284
283
284
+ jobject globalRef = ((AndroidContext *) platformContext.get ())->getJavaInstance ();
285
285
env->CallVoidMethod (globalRef, env->GetMethodID (NativeInstanceClass, " onAudioLevelsUpdated" , " ([I[F[Z)V" ), intArray, floatArray, boolArray);
286
286
env->DeleteLocalRef (intArray);
287
287
env->DeleteLocalRef (floatArray);
@@ -293,14 +293,14 @@ JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_makeGrou
293
293
294
294
auto *holder = new InstanceHolder;
295
295
holder->groupNativeInstance = std::make_unique<GroupInstanceImpl>(std::move (descriptor));
296
- holder->javaInstance = globalRef;
297
296
holder->_platformContext = platformContext;
298
- holder->groupNativeInstance ->emitJoinPayload ([globalRef ](const GroupJoinPayload& payload) {
297
+ holder->groupNativeInstance ->emitJoinPayload ([platformContext ](const GroupJoinPayload& payload) {
299
298
JNIEnv *env = webrtc::AttachCurrentThreadIfNeeded ();
300
299
jobjectArray array = env->NewObjectArray (payload.fingerprints .size (), FingerprintClass, 0 );
301
300
for (int a = 0 ; a < payload.fingerprints .size (); a++) {
302
301
env->SetObjectArrayElement (array, a, asJavaFingerprint (env, payload.fingerprints [a].hash , payload.fingerprints [a].setup , payload.fingerprints [a].fingerprint ));
303
302
}
303
+ jobject globalRef = ((AndroidContext *) platformContext.get ())->getJavaInstance ();
304
304
env->CallVoidMethod (globalRef, env->GetMethodID (NativeInstanceClass, " onEmitJoinPayload" , " (Ljava/lang/String;Ljava/lang/String;[Lorg/telegram/messenger/voip/Instance$Fingerprint;I)V" ), env->NewStringUTF (payload.ufrag .c_str ()), env->NewStringUTF (payload.pwd .c_str ()), array, (jint) payload.ssrc );
305
305
});
306
306
return reinterpret_cast <jlong>(holder);
@@ -382,56 +382,65 @@ JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_makeNati
382
382
memcpy (encryptionKeyValue->data (), valueBytes, 256 );
383
383
env->ReleaseByteArrayElements (valueByteArray, (jbyte *) valueBytes, JNI_ABORT);
384
384
385
- jobject globalRef = env->NewGlobalRef (instanceObj);
386
385
std::shared_ptr<VideoCaptureInterface> videoCapture = videoCapturer ? std::shared_ptr<VideoCaptureInterface>(reinterpret_cast <VideoCaptureInterface *>(videoCapturer)) : nullptr ;
387
386
388
- std::shared_ptr<PlatformContext> platformContext = videoCapture ? videoCapture->getPlatformContext () : std::make_shared<AndroidContext>(env);
387
+ std::shared_ptr<PlatformContext> platformContext;
388
+ if (videoCapture) {
389
+ platformContext = videoCapture->getPlatformContext ();
390
+ ((AndroidContext *) platformContext.get ())->setJavaInstance (env, instanceObj);
391
+ } else {
392
+ platformContext = std::make_shared<AndroidContext>(env, instanceObj);
393
+ }
389
394
390
395
Descriptor descriptor = {
391
396
.config = Config{
392
397
.initializationTimeout = configObject.getDoubleField (" initializationTimeout" ),
393
398
.receiveTimeout = configObject.getDoubleField (" receiveTimeout" ),
394
399
.dataSaving = parseDataSaving (env, configObject.getIntField (" dataSaving" )),
395
400
.enableP2P = configObject.getBooleanField (" enableP2p" ) == JNI_TRUE,
401
+ .enableStunMarking = configObject.getBooleanField (" enableSm" ) == JNI_TRUE,
396
402
.enableAEC = configObject.getBooleanField (" enableAec" ) == JNI_TRUE,
397
403
.enableNS = configObject.getBooleanField (" enableNs" ) == JNI_TRUE,
398
404
.enableAGC = configObject.getBooleanField (" enableAgc" ) == JNI_TRUE,
399
- .enableStunMarking = configObject.getBooleanField (" enableSm" ) == JNI_TRUE,
400
405
.enableVolumeControl = true ,
401
406
.logPath = tgvoip::jni::JavaStringToStdString (env, configObject.getStringField (" logPath" )),
407
+ .statsLogPath = tgvoip::jni::JavaStringToStdString (env, configObject.getStringField (" statsLogPath" )),
402
408
.maxApiLayer = configObject.getIntField (" maxApiLayer" ),
403
409
.enableHighBitrateVideo = true ,
404
- .statsLogPath = tgvoip::jni::JavaStringToStdString (env, configObject.getStringField (" statsLogPath" )),
405
410
.preferredVideoCodecs = {cricket::kVp9CodecName }
406
411
},
407
412
.encryptionKey = EncryptionKey (
408
413
std::move (encryptionKeyValue),
409
414
encryptionKeyObject.getBooleanField (" isOutgoing" ) == JNI_TRUE),
410
415
.videoCapture = videoCapture,
411
- .stateUpdated = [globalRef ](State state) {
416
+ .stateUpdated = [platformContext ](State state) {
412
417
jint javaState = asJavaState (state);
418
+ jobject globalRef = ((AndroidContext *) platformContext.get ())->getJavaInstance ();
413
419
tgvoip::jni::DoWithJNI ([globalRef, javaState](JNIEnv *env) {
414
420
env->CallVoidMethod (globalRef, env->GetMethodID (NativeInstanceClass, " onStateUpdated" , " (I)V" ), javaState);
415
421
});
416
422
},
417
- .platformContext = platformContext,
418
- . signalBarsUpdated = [ globalRef]( int count) {
423
+ .signalBarsUpdated = [ platformContext]( int count) {
424
+ jobject globalRef = ((AndroidContext *) platformContext. get ())-> getJavaInstance ();
419
425
tgvoip::jni::DoWithJNI ([globalRef, count](JNIEnv *env) {
420
426
env->CallVoidMethod (globalRef, env->GetMethodID (NativeInstanceClass, " onSignalBarsUpdated" , " (I)V" ), count);
421
427
});
422
428
},
423
- .remoteMediaStateUpdated = [globalRef](AudioState audioState, VideoState videoState) {
429
+ .remoteMediaStateUpdated = [platformContext](AudioState audioState, VideoState videoState) {
430
+ jobject globalRef = ((AndroidContext *) platformContext.get ())->getJavaInstance ();
424
431
tgvoip::jni::DoWithJNI ([globalRef, audioState, videoState](JNIEnv *env) {
425
432
env->CallVoidMethod (globalRef, env->GetMethodID (NativeInstanceClass, " onRemoteMediaStateUpdated" , " (II)V" ), (jint) audioState, (jint )videoState);
426
433
});
427
434
},
428
- .signalingDataEmitted = [globalRef](const std::vector<uint8_t > &data) {
435
+ .signalingDataEmitted = [platformContext](const std::vector<uint8_t > &data) {
436
+ jobject globalRef = ((AndroidContext *) platformContext.get ())->getJavaInstance ();
429
437
tgvoip::jni::DoWithJNI ([globalRef, data](JNIEnv *env) {
430
438
jbyteArray arr = copyVectorToJavaByteArray (env, data);
431
439
env->CallVoidMethod (globalRef, env->GetMethodID (NativeInstanceClass, " onSignalingData" , " ([B)V" ), arr);
432
440
env->DeleteLocalRef (arr);
433
441
});
434
442
},
443
+ .platformContext = platformContext,
435
444
};
436
445
437
446
for (int i = 0 , size = env->GetArrayLength (endpoints); i < size; i++) {
@@ -474,7 +483,6 @@ JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_makeNati
474
483
475
484
auto *holder = new InstanceHolder;
476
485
holder->nativeInstance = tgcalls::Meta::Create (v, std::move (descriptor));
477
- holder->javaInstance = globalRef;
478
486
holder->_videoCapture = videoCapture;
479
487
holder->_platformContext = platformContext;
480
488
holder->nativeInstance ->setIncomingVideoOutput (webrtc::JavaToNativeVideoSink (env, remoteSink));
@@ -576,10 +584,10 @@ JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_stopNativ
576
584
}
577
585
instance->nativeInstance ->stop ([instance](FinalState finalState) {
578
586
JNIEnv *env = webrtc::AttachCurrentThreadIfNeeded ();
579
- const std::string &path = tgvoip::jni::JavaStringToStdString (env, JavaObject (env, instance->javaInstance ).getStringField (" persistentStateFilePath" ));
587
+ jobject globalRef = ((AndroidContext *) instance->_platformContext .get ())->getJavaInstance ();
588
+ const std::string &path = tgvoip::jni::JavaStringToStdString (env, JavaObject (env, globalRef).getStringField (" persistentStateFilePath" ));
580
589
savePersistentState (path.c_str (), finalState.persistentState );
581
- env->CallVoidMethod (instance->javaInstance , env->GetMethodID (NativeInstanceClass, " onStop" , " (Lorg/telegram/messenger/voip/Instance$FinalState;)V" ), asJavaFinalState (env, finalState));
582
- env->DeleteGlobalRef (instance->javaInstance );
590
+ env->CallVoidMethod (globalRef, env->GetMethodID (NativeInstanceClass, " onStop" , " (Lorg/telegram/messenger/voip/Instance$FinalState;)V" ), asJavaFinalState (env, finalState));
583
591
delete instance;
584
592
});
585
593
}
@@ -591,13 +599,12 @@ JNIEXPORT void JNICALL Java_org_telegram_messenger_voip_NativeInstance_stopGroup
591
599
}
592
600
instance->groupNativeInstance ->stop ();
593
601
instance->groupNativeInstance .reset ();
594
- env->DeleteGlobalRef (instance->javaInstance );
595
602
delete instance;
596
603
}
597
604
598
605
JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_createVideoCapturer (JNIEnv *env, jclass clazz, jobject localSink, jboolean front) {
599
606
initWebRTC (env);
600
- std::unique_ptr<VideoCaptureInterface> capture = tgcalls::VideoCaptureInterface::Create (front ? " front" : " back" , std::make_shared<AndroidContext>(env));
607
+ std::unique_ptr<VideoCaptureInterface> capture = tgcalls::VideoCaptureInterface::Create (front ? " front" : " back" , std::make_shared<AndroidContext>(env, nullptr ));
601
608
capture->setOutput (webrtc::JavaToNativeVideoSink (env, localSink));
602
609
capture->setState (VideoState::Active);
603
610
return reinterpret_cast <intptr_t >(capture.release ());
0 commit comments