From d22ff8a158a8c73e19a6bc8d22addad065bd6c8f Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Tue, 30 Aug 2022 20:40:16 -0700 Subject: [PATCH] [wpiutil] Add JNI access to C++ stderr (#4381) This is useful in some debugging scenarios. System.err is separately buffered, so when e.g. debugging test cases it doesn't interleave correctly with the C++ stdout/stderr logging. Even using flush() doesn't seem to help, I think because Gradle does its own buffering. --- .../main/java/edu/wpi/first/util/WPIUtilJNI.java | 2 ++ wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/wpiutil/src/main/java/edu/wpi/first/util/WPIUtilJNI.java b/wpiutil/src/main/java/edu/wpi/first/util/WPIUtilJNI.java index d2a76fe4da..92e4f17d90 100644 --- a/wpiutil/src/main/java/edu/wpi/first/util/WPIUtilJNI.java +++ b/wpiutil/src/main/java/edu/wpi/first/util/WPIUtilJNI.java @@ -54,6 +54,8 @@ public class WPIUtilJNI { libraryLoaded = true; } + public static native void writeStderr(String str); + public static native void enableMockTime(); public static native void disableMockTime(); diff --git a/wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp b/wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp index 34ca873ed1..15b1895718 100644 --- a/wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp +++ b/wpiutil/src/main/native/cpp/jni/WPIUtilJNI.cpp @@ -5,6 +5,7 @@ #include #include "edu_wpi_first_util_WPIUtilJNI.h" +#include "fmt/format.h" #include "wpi/Synchronization.h" #include "wpi/jni_util.h" #include "wpi/timestamp.h" @@ -41,6 +42,18 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved) { interruptedEx.free(env); } +/* + * Class: edu_wpi_first_util_WPIUtilJNI + * Method: writeStderr + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL +Java_edu_wpi_first_util_WPIUtilJNI_writeStderr + (JNIEnv* env, jclass, jstring str) +{ + fmt::print(stderr, "{}", JStringRef{env, str}); +} + /* * Class: edu_wpi_first_util_WPIUtilJNI * Method: enableMockTime