[*] 关闭房间

This commit is contained in:
acgist
2023-04-28 08:19:20 +08:00
parent 0aa1c00a22
commit 3dbf52eb1a
10 changed files with 90 additions and 83 deletions

View File

@@ -8,12 +8,13 @@
namespace acgist { namespace acgist {
#ifndef TAOYAO_JAVA_VM
#define TAOYAO_JAVA_VM
/** /**
* 全局JavaVM指针 * 全局JavaVM指针
*/ */
extern JavaVM* taoyaoJavaVM; extern JavaVM* taoyaoJavaVM;
#endif
extern void bindJavaThread(JNIEnv** env, const char* name = "C++Thread");
extern void unbindJavaThread();
} }

View File

@@ -8,7 +8,6 @@
#include "sdk/android/native_api/jni/scoped_java_ref.h" #include "sdk/android/native_api/jni/scoped_java_ref.h"
#include "Log.hpp" #include "Log.hpp"
#include "MediaManager.hpp"
#include "RouterCallback.hpp" #include "RouterCallback.hpp"
namespace acgist { namespace acgist {
@@ -44,7 +43,7 @@ namespace acgist {
void mediaConsumerPause(JNIEnv* env, const std::string& consumerId); void mediaConsumerPause(JNIEnv* env, const std::string& consumerId);
void mediaConsumerResume(JNIEnv* env, const std::string& consumerId); void mediaConsumerResume(JNIEnv* env, const std::string& consumerId);
void mediaConsumerClose(JNIEnv* env, const std::string& consumerId); void mediaConsumerClose(JNIEnv* env, const std::string& consumerId);
void closeRoom(); void closeRoom(JNIEnv* env);
}; };
} }

View File

@@ -3,6 +3,7 @@
#include <string> #include <string>
#include "jni.h" #include "jni.h"
#include "MediaManager.hpp"
#include "mediasoupclient.hpp" #include "mediasoupclient.hpp"
namespace acgist { namespace acgist {
@@ -10,6 +11,9 @@ namespace acgist {
class RouterCallback { class RouterCallback {
public: public:
jobject routerCallback; jobject routerCallback;
public:
RouterCallback(jobject routerCallback);
virtual ~RouterCallback();
public: public:
void enterRoomCallback(JNIEnv* env, const std::string& rtpCapabilities, const std::string& sctpCapabilities); void enterRoomCallback(JNIEnv* env, const std::string& rtpCapabilities, const std::string& sctpCapabilities);
void closeRoomCallback(JNIEnv* env); void closeRoomCallback(JNIEnv* env);

View File

@@ -4,11 +4,23 @@ namespace acgist {
JavaVM* taoyaoJavaVM = nullptr; 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) { extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* javaVM, void* reserved) {
taoyaoJavaVM = javaVM; taoyaoJavaVM = javaVM;
// JNIEnv* env = webrtc::jni::GetEnv();
webrtc::jni::InitGlobalJniVariables(javaVM); webrtc::jni::InitGlobalJniVariables(javaVM);
return JNI_VERSION_1_6; return JNI_VERSION_1_6;
} }

View File

@@ -18,17 +18,14 @@ namespace acgist {
std::future<void> OnConnect(mediasoupclient::Transport* transport, const nlohmann::json& dtlsParameters) override { std::future<void> OnConnect(mediasoupclient::Transport* transport, const nlohmann::json& dtlsParameters) override {
const std::string cTransportId = transport->GetId(); const std::string cTransportId = transport->GetId();
const std::string cDtlsParameters = dtlsParameters.dump(); const std::string cDtlsParameters = dtlsParameters.dump();
JNIEnv* env = webrtc::jni::GetEnv(); JNIEnv* env = nullptr;
// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) {
bindJavaThread(&env);
this->room->sendTransportConnectCallback(env, cTransportId, cDtlsParameters); this->room->sendTransportConnectCallback(env, cTransportId, cDtlsParameters);
// } else { unbindJavaThread();
// JavaVMAttachArgs args; } else {
// args.name = "C++Callback"; this->room->sendTransportConnectCallback(env, cTransportId, cDtlsParameters);
// args.version = JNI_VERSION_1_6; }
// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, &args);
// this->room->sendTransportConnectCallback(env, cTransportId, cDtlsParameters);
// taoyaoJavaVM->DetachCurrentThread();
// }
std::promise <void> promise; std::promise <void> promise;
promise.set_value(); promise.set_value();
return promise.get_future(); return promise.get_future();
@@ -42,14 +39,14 @@ namespace acgist {
std::string result; std::string result;
const std::string cTransportId = transport->GetId(); const std::string cTransportId = transport->GetId();
const std::string cRtpParameters = rtpParameters.dump(); const std::string cRtpParameters = rtpParameters.dump();
JNIEnv* env = webrtc::jni::GetEnv(); JNIEnv* env = nullptr;
// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) {
bindJavaThread(&env);
result = this->room->sendTransportProduceCallback(env, kind, cTransportId, cRtpParameters); result = this->room->sendTransportProduceCallback(env, kind, cTransportId, cRtpParameters);
// } else { unbindJavaThread();
// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); } else {
// result = this->room->sendTransportProduceCallback(env, kind, cTransportId, cRtpParameters); result = this->room->sendTransportProduceCallback(env, kind, cTransportId, cRtpParameters);
// taoyaoJavaVM->DetachCurrentThread(); }
// }
std::promise <std::string> promise; std::promise <std::string> promise;
promise.set_value(result); promise.set_value(result);
return promise.get_future(); return promise.get_future();
@@ -57,7 +54,7 @@ namespace acgist {
std::future<std::string> OnProduceData(mediasoupclient::SendTransport* transport, const nlohmann::json& sctpStreamParameters, const std::string& label, const std::string& protocol, const nlohmann::json& appData) override { std::future<std::string> OnProduceData(mediasoupclient::SendTransport* transport, const nlohmann::json& sctpStreamParameters, const std::string& label, const std::string& protocol, const nlohmann::json& appData) override {
std::promise <std::string> promise; std::promise <std::string> promise;
// TODO实现 // TODO如果需要自行实现
return promise.get_future(); return promise.get_future();
} }
@@ -78,14 +75,14 @@ namespace acgist {
std::future<void> OnConnect(mediasoupclient::Transport* transport, const nlohmann::json& dtlsParameters) override { std::future<void> OnConnect(mediasoupclient::Transport* transport, const nlohmann::json& dtlsParameters) override {
const std::string cTransportId = transport->GetId(); const std::string cTransportId = transport->GetId();
const std::string cDtlsParameters = dtlsParameters.dump(); const std::string cDtlsParameters = dtlsParameters.dump();
JNIEnv* env = webrtc::jni::GetEnv(); JNIEnv* env = nullptr;
// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) {
bindJavaThread(&env);
this->room->recvTransportConnectCallback(env, cTransportId, cDtlsParameters); this->room->recvTransportConnectCallback(env, cTransportId, cDtlsParameters);
// } else { unbindJavaThread();
// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); } else {
// this->room->recvTransportConnectCallback(env, cTransportId, cDtlsParameters); this->room->recvTransportConnectCallback(env, cTransportId, cDtlsParameters);
// taoyaoJavaVM->DetachCurrentThread(); }
// }
std::promise <void> promise; std::promise <void> promise;
promise.set_value(); promise.set_value();
return promise.get_future(); return promise.get_future();
@@ -110,14 +107,14 @@ namespace acgist {
void OnTransportClose(mediasoupclient::Producer* producer) override { void OnTransportClose(mediasoupclient::Producer* producer) override {
producer->Close(); producer->Close();
JNIEnv* env = webrtc::jni::GetEnv(); JNIEnv* env = nullptr;
// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) {
bindJavaThread(&env);
this->room->producerCloseCallback(env, producer->GetId()); this->room->producerCloseCallback(env, producer->GetId());
// } else { unbindJavaThread();
// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); } else {
// this->room->producerCloseCallback(env, producer->GetId()); this->room->producerCloseCallback(env, producer->GetId());
// taoyaoJavaVM->DetachCurrentThread(); }
// }
} }
}; };
@@ -137,14 +134,14 @@ namespace acgist {
void OnTransportClose(mediasoupclient::Consumer* consumer) override { void OnTransportClose(mediasoupclient::Consumer* consumer) override {
consumer->Close(); consumer->Close();
JNIEnv* env = webrtc::jni::GetEnv(); JNIEnv* env = nullptr;
// if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) { if(taoyaoJavaVM->GetEnv((void**) &env, JNI_VERSION_1_6) == JNI_EDETACHED) {
bindJavaThread(&env);
this->room->consumerCloseCallback(env, consumer->GetId()); this->room->consumerCloseCallback(env, consumer->GetId());
// } else { unbindJavaThread();
// taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr); } else {
// this->room->consumerCloseCallback(env, consumer->GetId()); this->room->consumerCloseCallback(env, consumer->GetId());
// taoyaoJavaVM->DetachCurrentThread(); }
// }
} }
}; };
@@ -152,8 +149,7 @@ namespace acgist {
Room::Room( Room::Room(
const std::string& roomId, const std::string& roomId,
const jobject& routerCallback const jobject& routerCallback
) { ) : RouterCallback(routerCallback) {
this->routerCallback = routerCallback;
this->roomId = roomId; this->roomId = roomId;
this->factory = nullptr; this->factory = nullptr;
this->rtcConfiguration = nullptr; this->rtcConfiguration = nullptr;
@@ -179,14 +175,6 @@ namespace acgist {
delete this->videoProducer; delete this->videoProducer;
delete this->producerListener; delete this->producerListener;
delete this->consumerListener; 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( void Room::enterRoom(
@@ -220,7 +208,6 @@ namespace acgist {
json["dtlsParameters"], json["dtlsParameters"],
json["sctpParameters"], json["sctpParameters"],
&options &options
// TODO全局options
); );
} }
@@ -237,7 +224,6 @@ namespace acgist {
json["dtlsParameters"], json["dtlsParameters"],
json["sctpParameters"], json["sctpParameters"],
&options &options
// TODO全局options
); );
} }
@@ -367,38 +353,29 @@ namespace acgist {
this->consumerCloseCallback(env, consumerId); this->consumerCloseCallback(env, consumerId);
} }
void Room::closeRoom() { void Room::closeRoom(JNIEnv* env) {
std::map<std::string, mediasoupclient::Consumer*>::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) { if(this->audioProducer != nullptr) {
this->audioProducer->Close(); this->audioProducer->Close();
} }
if(this->videoProducer != nullptr) { if(this->videoProducer != nullptr) {
this->videoProducer->Close(); this->videoProducer->Close();
} }
std::map<std::string, mediasoupclient::Consumer*>::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<std::string, mediasoupclient::Consumer*> entry) {
// entry.second->Close();
// delete entry.second;
// });
this->consumers.clear();
if(this->sendTransport != nullptr) { if(this->sendTransport != nullptr) {
this->sendTransport->Close(); this->sendTransport->Close();
} }
if(this->recvTransport != nullptr) { if(this->recvTransport != nullptr) {
this->recvTransport->Close(); 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); this->closeRoomCallback(env);
} else {
taoyaoJavaVM->AttachCurrentThreadAsDaemon(&env, nullptr);
this->closeRoomCallback(env);
taoyaoJavaVM->DetachCurrentThread();
}
} }
extern "C" JNIEXPORT jlong JNICALL extern "C" JNIEXPORT jlong JNICALL
@@ -441,7 +418,7 @@ namespace acgist {
extern "C" JNIEXPORT void JNICALL extern "C" JNIEXPORT void JNICALL
Java_com_acgist_taoyao_media_client_Room_nativeCloseRoom(JNIEnv* env, jobject me, jlong nativeRoomPointer) { Java_com_acgist_taoyao_media_client_Room_nativeCloseRoom(JNIEnv* env, jobject me, jlong nativeRoomPointer) {
Room* room = (Room*) nativeRoomPointer; Room* room = (Room*) nativeRoomPointer;
room->closeRoom(); room->closeRoom(env);
delete room; delete room;
} }

View File

@@ -4,6 +4,21 @@
namespace acgist { 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) { void RouterCallback::enterRoomCallback(JNIEnv* env, const std::string& rtpCapabilities, const std::string& sctpCapabilities) {
jclass jCallbackClazz = env->GetObjectClass(this->routerCallback); jclass jCallbackClazz = env->GetObjectClass(this->routerCallback);
jmethodID recvTransportConnectCallback = env->GetMethodID(jCallbackClazz, "enterRoomCallback", "(Ljava/lang/String;Ljava/lang/String;)V"); jmethodID recvTransportConnectCallback = env->GetMethodID(jCallbackClazz, "enterRoomCallback", "(Ljava/lang/String;Ljava/lang/String;)V");
@@ -115,7 +130,7 @@ namespace acgist {
); );
env->DeleteLocalRef(jKind); env->DeleteLocalRef(jKind);
env->DeleteLocalRef(jProducerId); env->DeleteLocalRef(jProducerId);
// env->DeleteLocalRef(jCallbackClazz); env->DeleteLocalRef(jCallbackClazz);
} }
void RouterCallback::producerCloseCallback(JNIEnv* env, const std::string& producerId) {} void RouterCallback::producerCloseCallback(JNIEnv* env, const std::string& producerId) {}

View File

@@ -17,7 +17,7 @@
<url>https://gitee.com/acgist/taoyao</url> <url>https://gitee.com/acgist/taoyao</url>
<name>taoyao</name> <name>taoyao</name>
<description>桃夭:桃夭是套基于`Mediasoup`开发的`WebRTC`音视频信令服务</description> <description>桃夭:桃夭是套基于`Mediasoup`开发的`WebRTC`音视频信令服务,可以非常方便的扩展信令接入更多智能终端。</description>
<inceptionYear>2022</inceptionYear> <inceptionYear>2022</inceptionYear>
<properties> <properties>
@@ -180,7 +180,6 @@
<include>*.p12</include> <include>*.p12</include>
<include>*.pfx</include> <include>*.pfx</include>
<exclude>*.yml</exclude> <exclude>*.yml</exclude>
<include>*.TTF</include>
<exclude>*.properties</exclude> <exclude>*.properties</exclude>
</excludes> </excludes>
<archive> <archive>

View File

@@ -14,7 +14,7 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<name>taoyao-boot</name> <name>taoyao-boot</name>
<description>启动模块:基础模块</description> <description>基础模块</description>
<dependencies> <dependencies>
<dependency> <dependency>

View File

@@ -14,7 +14,7 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<name>taoyao-server</name> <name>taoyao-server</name>
<description>启动服务:启动模块</description> <description>启动服务</description>
<properties> <properties>
<taoyao.maven.basedir>${project.parent.basedir}</taoyao.maven.basedir> <taoyao.maven.basedir>${project.parent.basedir}</taoyao.maven.basedir>

View File

@@ -14,7 +14,7 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<name>taoyao-signal</name> <name>taoyao-signal</name>
<description>信令:信令模块</description> <description>信令模块</description>
<dependencies> <dependencies>
<dependency> <dependency>