From 3dbf52eb1ab1c6199e70952b1582b29fdc54c10b Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Fri, 28 Apr 2023 08:19:20 +0800 Subject: [PATCH] =?UTF-8?q?[*]=20=E5=85=B3=E9=97=AD=E6=88=BF=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/cpp/include/MediaManager.hpp | 7 +- .../media/src/main/cpp/include/Room.hpp | 3 +- .../src/main/cpp/include/RouterCallback.hpp | 4 + .../src/main/cpp/webrtc/MediaManager.cpp | 12 ++ .../taoyao/media/src/main/cpp/webrtc/Room.cpp | 121 +++++++----------- .../src/main/cpp/webrtc/RouterCallback.cpp | 17 ++- taoyao-signal-server/pom.xml | 3 +- taoyao-signal-server/taoyao-boot/pom.xml | 2 +- taoyao-signal-server/taoyao-server/pom.xml | 2 +- taoyao-signal-server/taoyao-signal/pom.xml | 2 +- 10 files changed, 90 insertions(+), 83 deletions(-) diff --git a/taoyao-client-android/taoyao/media/src/main/cpp/include/MediaManager.hpp b/taoyao-client-android/taoyao/media/src/main/cpp/include/MediaManager.hpp index 09f7e6c..6282938 100644 --- a/taoyao-client-android/taoyao/media/src/main/cpp/include/MediaManager.hpp +++ b/taoyao-client-android/taoyao/media/src/main/cpp/include/MediaManager.hpp @@ -8,12 +8,13 @@ namespace acgist { -#ifndef TAOYAO_JAVA_VM -#define TAOYAO_JAVA_VM /** * 全局JavaVM指针 */ extern JavaVM* taoyaoJavaVM; -#endif + + extern void bindJavaThread(JNIEnv** env, const char* name = "C++Thread"); + + extern void unbindJavaThread(); } \ No newline at end of file diff --git a/taoyao-client-android/taoyao/media/src/main/cpp/include/Room.hpp b/taoyao-client-android/taoyao/media/src/main/cpp/include/Room.hpp index 5bc5cb9..e2c2182 100644 --- a/taoyao-client-android/taoyao/media/src/main/cpp/include/Room.hpp +++ b/taoyao-client-android/taoyao/media/src/main/cpp/include/Room.hpp @@ -8,7 +8,6 @@ #include "sdk/android/native_api/jni/scoped_java_ref.h" #include "Log.hpp" -#include "MediaManager.hpp" #include "RouterCallback.hpp" namespace acgist { @@ -44,7 +43,7 @@ namespace acgist { void mediaConsumerPause(JNIEnv* env, const std::string& consumerId); void mediaConsumerResume(JNIEnv* env, const std::string& consumerId); void mediaConsumerClose(JNIEnv* env, const std::string& consumerId); - void closeRoom(); + void closeRoom(JNIEnv* env); }; } \ No newline at end of file diff --git a/taoyao-client-android/taoyao/media/src/main/cpp/include/RouterCallback.hpp b/taoyao-client-android/taoyao/media/src/main/cpp/include/RouterCallback.hpp index c18a04c..0a0bdb1 100644 --- a/taoyao-client-android/taoyao/media/src/main/cpp/include/RouterCallback.hpp +++ b/taoyao-client-android/taoyao/media/src/main/cpp/include/RouterCallback.hpp @@ -3,6 +3,7 @@ #include #include "jni.h" +#include "MediaManager.hpp" #include "mediasoupclient.hpp" namespace acgist { @@ -10,6 +11,9 @@ namespace acgist { class RouterCallback { public: jobject routerCallback; + public: + RouterCallback(jobject routerCallback); + virtual ~RouterCallback(); public: void enterRoomCallback(JNIEnv* env, const std::string& rtpCapabilities, const std::string& sctpCapabilities); void closeRoomCallback(JNIEnv* env); diff --git a/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/MediaManager.cpp b/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/MediaManager.cpp index 57aba8d..e5fbc10 100644 --- a/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/MediaManager.cpp +++ b/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/MediaManager.cpp @@ -4,11 +4,23 @@ namespace acgist { JavaVM* taoyaoJavaVM = nullptr; + void bindJavaThread(JNIEnv** env, const char* name) { + JavaVMAttachArgs args; + args.name = name; + args.version = JNI_VERSION_1_6; + taoyaoJavaVM->AttachCurrentThreadAsDaemon(env, &args); + } + + void unbindJavaThread() { + taoyaoJavaVM->DetachCurrentThread(); + } + /** * 非常重要 */ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* javaVM, void* reserved) { taoyaoJavaVM = javaVM; + // JNIEnv* env = webrtc::jni::GetEnv(); webrtc::jni::InitGlobalJniVariables(javaVM); return JNI_VERSION_1_6; } diff --git a/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/Room.cpp b/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/Room.cpp index d19538d..0c12d33 100644 --- a/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/Room.cpp +++ b/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/Room.cpp @@ -18,17 +18,14 @@ namespace acgist { std::future OnConnect(mediasoupclient::Transport* transport, const nlohmann::json& dtlsParameters) override { const std::string cTransportId = transport->GetId(); const std::string cDtlsParameters = dtlsParameters.dump(); - JNIEnv* env = webrtc::jni::GetEnv(); -// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + JNIEnv* env = nullptr; + if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + bindJavaThread(&env); this->room->sendTransportConnectCallback(env, cTransportId, cDtlsParameters); -// } else { -// JavaVMAttachArgs args; -// args.name = "C++Callback"; -// args.version = JNI_VERSION_1_6; -// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, &args); -// this->room->sendTransportConnectCallback(env, cTransportId, cDtlsParameters); -// taoyaoJavaVM->DetachCurrentThread(); -// } + unbindJavaThread(); + } else { + this->room->sendTransportConnectCallback(env, cTransportId, cDtlsParameters); + } std::promise promise; promise.set_value(); return promise.get_future(); @@ -42,14 +39,14 @@ namespace acgist { std::string result; const std::string cTransportId = transport->GetId(); const std::string cRtpParameters = rtpParameters.dump(); - JNIEnv* env = webrtc::jni::GetEnv(); -// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + JNIEnv* env = nullptr; + if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + bindJavaThread(&env); result = this->room->sendTransportProduceCallback(env, kind, cTransportId, cRtpParameters); -// } else { -// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); -// result = this->room->sendTransportProduceCallback(env, kind, cTransportId, cRtpParameters); -// taoyaoJavaVM->DetachCurrentThread(); -// } + unbindJavaThread(); + } else { + result = this->room->sendTransportProduceCallback(env, kind, cTransportId, cRtpParameters); + } std::promise promise; promise.set_value(result); return promise.get_future(); @@ -57,7 +54,7 @@ namespace acgist { std::future OnProduceData(mediasoupclient::SendTransport* transport, const nlohmann::json& sctpStreamParameters, const std::string& label, const std::string& protocol, const nlohmann::json& appData) override { std::promise promise; - // TODO:实现 + // TODO:如果需要自行实现 return promise.get_future(); } @@ -78,14 +75,14 @@ namespace acgist { std::future OnConnect(mediasoupclient::Transport* transport, const nlohmann::json& dtlsParameters) override { const std::string cTransportId = transport->GetId(); const std::string cDtlsParameters = dtlsParameters.dump(); - JNIEnv* env = webrtc::jni::GetEnv(); -// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + JNIEnv* env = nullptr; + if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + bindJavaThread(&env); this->room->recvTransportConnectCallback(env, cTransportId, cDtlsParameters); -// } else { -// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); -// this->room->recvTransportConnectCallback(env, cTransportId, cDtlsParameters); -// taoyaoJavaVM->DetachCurrentThread(); -// } + unbindJavaThread(); + } else { + this->room->recvTransportConnectCallback(env, cTransportId, cDtlsParameters); + } std::promise promise; promise.set_value(); return promise.get_future(); @@ -110,14 +107,14 @@ namespace acgist { void OnTransportClose(mediasoupclient::Producer* producer) override { producer->Close(); - JNIEnv* env = webrtc::jni::GetEnv(); -// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + JNIEnv* env = nullptr; + if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + bindJavaThread(&env); this->room->producerCloseCallback(env, producer->GetId()); -// } else { -// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); -// this->room->producerCloseCallback(env, producer->GetId()); -// taoyaoJavaVM->DetachCurrentThread(); -// } + unbindJavaThread(); + } else { + this->room->producerCloseCallback(env, producer->GetId()); + } } }; @@ -137,14 +134,14 @@ namespace acgist { void OnTransportClose(mediasoupclient::Consumer* consumer) override { consumer->Close(); - JNIEnv* env = webrtc::jni::GetEnv(); -// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + JNIEnv* env = nullptr; + if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + bindJavaThread(&env); this->room->consumerCloseCallback(env, consumer->GetId()); -// } else { -// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); -// this->room->consumerCloseCallback(env, consumer->GetId()); -// taoyaoJavaVM->DetachCurrentThread(); -// } + unbindJavaThread(); + } else { + this->room->consumerCloseCallback(env, consumer->GetId()); + } } }; @@ -152,8 +149,7 @@ namespace acgist { Room::Room( const std::string& roomId, const jobject& routerCallback - ) { - this->routerCallback = routerCallback; + ) : RouterCallback(routerCallback) { this->roomId = roomId; this->factory = nullptr; this->rtcConfiguration = nullptr; @@ -179,14 +175,6 @@ namespace acgist { delete this->videoProducer; delete this->producerListener; delete this->consumerListener; - JNIEnv* env = nullptr; - if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { - env->DeleteGlobalRef(this->routerCallback); - } else { - taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); - env->DeleteGlobalRef(this->routerCallback); - taoyaoJavaVM->DetachCurrentThread(); - } } void Room::enterRoom( @@ -220,7 +208,6 @@ namespace acgist { json["dtlsParameters"], json["sctpParameters"], &options - // TODO:全局options ); } @@ -237,7 +224,6 @@ namespace acgist { json["dtlsParameters"], json["sctpParameters"], &options - // TODO:全局options ); } @@ -367,38 +353,29 @@ namespace acgist { this->consumerCloseCallback(env, consumerId); } - void Room::closeRoom() { + void Room::closeRoom(JNIEnv* env) { + std::map::iterator iterator; + for (iterator = this->consumers.begin(); iterator != this->consumers.end(); iterator++) { + if(iterator->second == nullptr) { + continue; + } + iterator->second->Close(); + delete iterator->second; + } + this->consumers.clear(); if(this->audioProducer != nullptr) { this->audioProducer->Close(); } if(this->videoProducer != nullptr) { this->videoProducer->Close(); } - std::map::iterator iterator; - for (iterator = this->consumers.begin(); iterator != this->consumers.end(); iterator++) { - iterator->second->Close(); - delete iterator->second; - } -// std::for_each(this->consumers.begin(), this->consumers.end(), [](std::pair entry) { -// entry.second->Close(); -// delete entry.second; -// }); - this->consumers.clear(); if(this->sendTransport != nullptr) { this->sendTransport->Close(); } if(this->recvTransport != nullptr) { this->recvTransport->Close(); } - JNIEnv* env = nullptr; -// JNIEnv* env = webrtc::jni::GetEnv(); - if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { - this->closeRoomCallback(env); - } else { - taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); - this->closeRoomCallback(env); - taoyaoJavaVM->DetachCurrentThread(); - } + this->closeRoomCallback(env); } extern "C" JNIEXPORT jlong JNICALL @@ -441,7 +418,7 @@ namespace acgist { extern "C" JNIEXPORT void JNICALL Java_com_acgist_taoyao_media_client_Room_nativeCloseRoom(JNIEnv* env, jobject me, jlong nativeRoomPointer) { Room* room = (Room*) nativeRoomPointer; - room->closeRoom(); + room->closeRoom(env); delete room; } diff --git a/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/RouterCallback.cpp b/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/RouterCallback.cpp index 75acd69..4ba5a13 100644 --- a/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/RouterCallback.cpp +++ b/taoyao-client-android/taoyao/media/src/main/cpp/webrtc/RouterCallback.cpp @@ -4,6 +4,21 @@ namespace acgist { + RouterCallback::RouterCallback(jobject routerCallback) { + this->routerCallback = routerCallback; + } + + RouterCallback::~RouterCallback() { + JNIEnv* env = nullptr; + if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { + bindJavaThread(&env); + env->DeleteGlobalRef(this->routerCallback); + unbindJavaThread(); + } else { + env->DeleteGlobalRef(this->routerCallback); + } + } + void RouterCallback::enterRoomCallback(JNIEnv* env, const std::string& rtpCapabilities, const std::string& sctpCapabilities) { jclass jCallbackClazz = env->GetObjectClass(this->routerCallback); jmethodID recvTransportConnectCallback = env->GetMethodID(jCallbackClazz, "enterRoomCallback", "(Ljava/lang/String;Ljava/lang/String;)V"); @@ -115,7 +130,7 @@ namespace acgist { ); env->DeleteLocalRef(jKind); env->DeleteLocalRef(jProducerId); -// env->DeleteLocalRef(jCallbackClazz); + env->DeleteLocalRef(jCallbackClazz); } void RouterCallback::producerCloseCallback(JNIEnv* env, const std::string& producerId) {} diff --git a/taoyao-signal-server/pom.xml b/taoyao-signal-server/pom.xml index 3649f95..888ce9e 100644 --- a/taoyao-signal-server/pom.xml +++ b/taoyao-signal-server/pom.xml @@ -17,7 +17,7 @@ https://gitee.com/acgist/taoyao taoyao - 桃夭:桃夭是套基于`Mediasoup`开发的`WebRTC`音视频信令服务 + 桃夭:桃夭是套基于`Mediasoup`开发的`WebRTC`音视频信令服务,可以非常方便的扩展信令接入更多智能终端。 2022 @@ -180,7 +180,6 @@ *.p12 *.pfx *.yml - *.TTF *.properties diff --git a/taoyao-signal-server/taoyao-boot/pom.xml b/taoyao-signal-server/taoyao-boot/pom.xml index cdb56c6..282d4be 100644 --- a/taoyao-signal-server/taoyao-boot/pom.xml +++ b/taoyao-signal-server/taoyao-boot/pom.xml @@ -14,7 +14,7 @@ jar taoyao-boot - 启动模块:基础模块 + 基础模块 diff --git a/taoyao-signal-server/taoyao-server/pom.xml b/taoyao-signal-server/taoyao-server/pom.xml index 689d972..8a7dbd2 100644 --- a/taoyao-signal-server/taoyao-server/pom.xml +++ b/taoyao-signal-server/taoyao-server/pom.xml @@ -14,7 +14,7 @@ jar taoyao-server - 启动服务:启动模块 + 启动服务 ${project.parent.basedir} diff --git a/taoyao-signal-server/taoyao-signal/pom.xml b/taoyao-signal-server/taoyao-signal/pom.xml index 07794aa..5eb35fb 100644 --- a/taoyao-signal-server/taoyao-signal/pom.xml +++ b/taoyao-signal-server/taoyao-signal/pom.xml @@ -14,7 +14,7 @@ jar taoyao-signal - 信令:信令模块 + 信令模块