From 906582b7ed0e9f7013fe1daac65c789d11d2003a Mon Sep 17 00:00:00 2001 From: Isacco-B Date: Sat, 4 Apr 2026 23:37:22 +0200 Subject: [PATCH 1/2] fix: prevent JNI boundary exception crash in DesktopCapturer --- .../src/main/cpp/src/JNI_ScreenCapturer.cpp | 7 +++- .../src/main/cpp/src/JNI_WindowCapturer.cpp | 7 +++- .../media/video/desktop/DesktopCapturer.cpp | 36 ++++++++++++++----- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp b/webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp index 957292e8..33f45b97 100644 --- a/webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp +++ b/webrtc-jni/src/main/cpp/src/JNI_ScreenCapturer.cpp @@ -21,5 +21,10 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_ScreenCapturer_initialize (JNIEnv * env, jobject caller) { - SetHandle(env, caller, new jni::DesktopCapturer(true)); + try { + SetHandle(env, caller, new jni::DesktopCapturer(true)); + } + catch (...) { + ThrowCxxJavaException(env); + } } \ No newline at end of file diff --git a/webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp b/webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp index c08107b0..e93b8cee 100644 --- a/webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp +++ b/webrtc-jni/src/main/cpp/src/JNI_WindowCapturer.cpp @@ -21,5 +21,10 @@ JNIEXPORT void JNICALL Java_dev_onvoid_webrtc_media_video_desktop_WindowCapturer_initialize (JNIEnv * env, jobject caller) { - SetHandle(env, caller, new jni::DesktopCapturer(false)); + try { + SetHandle(env, caller, new jni::DesktopCapturer(false)); + } + catch (...) { + ThrowCxxJavaException(env); + } } \ No newline at end of file diff --git a/webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp b/webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp index 6df76c9a..9d559ec3 100644 --- a/webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp +++ b/webrtc-jni/src/main/cpp/src/media/video/desktop/DesktopCapturer.cpp @@ -19,6 +19,7 @@ #include "modules/desktop_capture/desktop_capturer.h" #include "modules/desktop_capture/desktop_capture_options.h" #include "modules/desktop_capture/desktop_and_cursor_composer.h" +#include "rtc_base/logging.h" namespace jni { @@ -36,14 +37,22 @@ namespace jni options.set_allow_directx_capturer(true); #endif - if (screenCapturer) { - capturer = std::make_unique( - webrtc::DesktopCapturer::CreateScreenCapturer(options), options); - } - else { - capturer = std::make_unique( - webrtc::DesktopCapturer::CreateWindowCapturer(options), options); + std::unique_ptr inner = screenCapturer + ? webrtc::DesktopCapturer::CreateScreenCapturer(options) + : webrtc::DesktopCapturer::CreateWindowCapturer(options); + + if (!inner) { + RTC_LOG(LS_ERROR) << (screenCapturer + ? "DesktopCapturer: CreateScreenCapturer returned null. " + "Possible causes: missing X11/XDAMAGE extension, Wayland " + "session without PipeWire support, or snap confinement." + : "DesktopCapturer: CreateWindowCapturer returned null. " + "Possible causes: missing X11/XFIXES extension or snap confinement."); + // Leave capturer as nullptr; callers check via GetSourceList returning false. + return; } + + capturer = std::make_unique(std::move(inner), options); } DesktopCapturer::~DesktopCapturer() @@ -53,6 +62,8 @@ namespace jni void DesktopCapturer::Start(webrtc::DesktopCapturer::Callback * callback) { + if (!capturer) return; + capturer->Start(callback); if (focusSelectedSource) { @@ -62,16 +73,20 @@ namespace jni void DesktopCapturer::SetMaxFrameRate(uint32_t max_frame_rate) { + if (!capturer) return; capturer->SetMaxFrameRate(max_frame_rate); } void DesktopCapturer::SetSharedMemoryFactory(std::unique_ptr factory) { + if (!capturer) return; capturer->SetSharedMemoryFactory(std::move(factory)); } void DesktopCapturer::CaptureFrame() { + if (!capturer) return; + #if defined(WEBRTC_MAC) CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true); #endif @@ -81,21 +96,25 @@ namespace jni void DesktopCapturer::SetExcludedWindow(webrtc::WindowId window) { + if (!capturer) return; capturer->SetExcludedWindow(window); } bool DesktopCapturer::GetSourceList(webrtc::DesktopCapturer::SourceList * sources) { + if (!capturer) return false; return capturer->GetSourceList(sources); } bool DesktopCapturer::SelectSource(webrtc::DesktopCapturer::SourceId id) { + if (!capturer) return false; return capturer->SelectSource(id); } bool DesktopCapturer::FocusOnSelectedSource() { + if (!capturer) return false; return capturer->FocusOnSelectedSource(); } @@ -106,6 +125,7 @@ namespace jni bool DesktopCapturer::IsOccluded(const webrtc::DesktopVector & pos) { + if (!capturer) return false; return capturer->IsOccluded(pos); } -} \ No newline at end of file +} From 13816c09f819554eed0e6aa8a619119edb4288c9 Mon Sep 17 00:00:00 2001 From: Isacco-B Date: Sun, 5 Apr 2026 00:19:24 +0200 Subject: [PATCH 2/2] fix: add WEBRTC_USE_X11 define to fix DesktopCaptureOptions ABI mismatch --- webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt b/webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt index a11a7b5e..b8ade4b4 100644 --- a/webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt +++ b/webrtc-jni/src/main/cpp/dependencies/webrtc/CMakeLists.txt @@ -172,7 +172,7 @@ elseif(LINUX) pkg_check_modules(DBUS REQUIRED dbus-1) target_include_directories(${PROJECT_NAME} PUBLIC ${DBUS_INCLUDE_DIRS}) - target_compile_definitions(${PROJECT_NAME} PUBLIC WEBRTC_LINUX WEBRTC_POSIX WEBRTC_USE_H264) + target_compile_definitions(${PROJECT_NAME} PUBLIC WEBRTC_LINUX WEBRTC_POSIX WEBRTC_USE_H264 WEBRTC_USE_X11) target_link_libraries(${PROJECT_NAME} X11 Xfixes Xrandr Xcomposite dbus-1) elseif(WIN32) target_compile_definitions(${PROJECT_NAME} PUBLIC WEBRTC_WIN WEBRTC_USE_H264 NOMINMAX WIN32_LEAN_AND_MEAN NDEBUG)