| Index: webrtc/sdk/android/src/jni/pc/statsobserver_jni.cc
|
| diff --git a/webrtc/sdk/android/src/jni/ownedfactoryandthreads.cc b/webrtc/sdk/android/src/jni/pc/statsobserver_jni.cc
|
| similarity index 15%
|
| rename from webrtc/sdk/android/src/jni/ownedfactoryandthreads.cc
|
| rename to webrtc/sdk/android/src/jni/pc/statsobserver_jni.cc
|
| index a3aa45c4bead267acec36c6862cae84a9790d792..aeb4a44ef2bfa146e5552fae790e132278b15183 100644
|
| --- a/webrtc/sdk/android/src/jni/ownedfactoryandthreads.cc
|
| +++ b/webrtc/sdk/android/src/jni/pc/statsobserver_jni.cc
|
| @@ -8,57 +8,78 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| -#include "webrtc/sdk/android/src/jni/ownedfactoryandthreads.h"
|
| +#include "webrtc/sdk/android/src/jni/pc/statsobserver_jni.h"
|
|
|
| -#include "webrtc/rtc_base/logging.h"
|
| #include "webrtc/sdk/android/src/jni/classreferenceholder.h"
|
| -#include "webrtc/sdk/android/src/jni/jni_helpers.h"
|
|
|
| namespace webrtc_jni {
|
|
|
| -PeerConnectionFactoryInterface* factoryFromJava(jlong j_p) {
|
| - return reinterpret_cast<OwnedFactoryAndThreads*>(j_p)->factory();
|
| +// Convenience, used since callbacks occur on the signaling thread, which may
|
| +// be a non-Java thread.
|
| +static JNIEnv* jni() {
|
| + return AttachCurrentThreadIfNeeded();
|
| }
|
|
|
| -OwnedFactoryAndThreads::~OwnedFactoryAndThreads() {
|
| - CHECK_RELEASE(factory_);
|
| - if (network_monitor_factory_ != nullptr) {
|
| - rtc::NetworkMonitorFactory::ReleaseFactory(network_monitor_factory_);
|
| - }
|
| +StatsObserverJni::StatsObserverJni(JNIEnv* jni, jobject j_observer)
|
| + : j_observer_global_(jni, j_observer),
|
| + j_observer_class_(jni, GetObjectClass(jni, j_observer)),
|
| + j_stats_report_class_(jni, FindClass(jni, "org/webrtc/StatsReport")),
|
| + j_stats_report_ctor_(GetMethodID(jni,
|
| + *j_stats_report_class_,
|
| + "<init>",
|
| + "(Ljava/lang/String;Ljava/lang/String;D"
|
| + "[Lorg/webrtc/StatsReport$Value;)V")),
|
| + j_value_class_(jni, FindClass(jni, "org/webrtc/StatsReport$Value")),
|
| + j_value_ctor_(GetMethodID(jni,
|
| + *j_value_class_,
|
| + "<init>",
|
| + "(Ljava/lang/String;Ljava/lang/String;)V")) {}
|
| +
|
| +void StatsObserverJni::OnComplete(const webrtc::StatsReports& reports) {
|
| + ScopedLocalRefFrame local_ref_frame(jni());
|
| + jobjectArray j_reports = ReportsToJava(jni(), reports);
|
| + jmethodID m = GetMethodID(jni(), *j_observer_class_, "onComplete",
|
| + "([Lorg/webrtc/StatsReport;)V");
|
| + jni()->CallVoidMethod(*j_observer_global_, m, j_reports);
|
| + CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
|
| }
|
|
|
| -void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() {
|
| - JNIEnv* jni = AttachCurrentThreadIfNeeded();
|
| - ScopedLocalRefFrame local_ref_frame(jni);
|
| - jclass j_factory_class = FindClass(jni, "org/webrtc/PeerConnectionFactory");
|
| - jmethodID m = nullptr;
|
| - if (network_thread_->IsCurrent()) {
|
| - LOG(LS_INFO) << "Network thread JavaCallback";
|
| - m = GetStaticMethodID(jni, j_factory_class, "onNetworkThreadReady", "()V");
|
| - }
|
| - if (worker_thread_->IsCurrent()) {
|
| - LOG(LS_INFO) << "Worker thread JavaCallback";
|
| - m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V");
|
| - }
|
| - if (signaling_thread_->IsCurrent()) {
|
| - 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";
|
| +jobjectArray StatsObserverJni::ReportsToJava(
|
| + JNIEnv* jni,
|
| + const webrtc::StatsReports& reports) {
|
| + jobjectArray reports_array =
|
| + jni->NewObjectArray(reports.size(), *j_stats_report_class_, NULL);
|
| + int i = 0;
|
| + for (const auto* report : reports) {
|
| + ScopedLocalRefFrame local_ref_frame(jni);
|
| + jstring j_id = JavaStringFromStdString(jni, report->id()->ToString());
|
| + jstring j_type = JavaStringFromStdString(jni, report->TypeToString());
|
| + jobjectArray j_values = ValuesToJava(jni, report->values());
|
| + jobject j_report =
|
| + jni->NewObject(*j_stats_report_class_, j_stats_report_ctor_, j_id,
|
| + j_type, report->timestamp(), j_values);
|
| + jni->SetObjectArrayElement(reports_array, i++, j_report);
|
| }
|
| + return reports_array;
|
| }
|
|
|
| -void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() {
|
| - LOG(LS_INFO) << "InvokeJavaCallbacksOnFactoryThreads.";
|
| - network_thread_->Invoke<void>(RTC_FROM_HERE,
|
| - [this] { JavaCallbackOnFactoryThreads(); });
|
| - worker_thread_->Invoke<void>(RTC_FROM_HERE,
|
| - [this] { JavaCallbackOnFactoryThreads(); });
|
| - signaling_thread_->Invoke<void>(RTC_FROM_HERE,
|
| - [this] { JavaCallbackOnFactoryThreads(); });
|
| +jobjectArray StatsObserverJni::ValuesToJava(
|
| + JNIEnv* jni,
|
| + const webrtc::StatsReport::Values& values) {
|
| + jobjectArray j_values =
|
| + jni->NewObjectArray(values.size(), *j_value_class_, NULL);
|
| + int i = 0;
|
| + for (const auto& it : values) {
|
| + ScopedLocalRefFrame local_ref_frame(jni);
|
| + // Should we use the '.name' enum value here instead of converting the
|
| + // name to a string?
|
| + jstring j_name = JavaStringFromStdString(jni, it.second->display_name());
|
| + jstring j_value = JavaStringFromStdString(jni, it.second->ToString());
|
| + jobject j_element_value =
|
| + jni->NewObject(*j_value_class_, j_value_ctor_, j_name, j_value);
|
| + jni->SetObjectArrayElement(j_values, i++, j_element_value);
|
| + }
|
| + return j_values;
|
| }
|
|
|
| } // namespace webrtc_jni
|
|
|