java - 如何在 C++ 中使用 JNI 将异常堆栈跟踪重定向到日志文件?

标签 java c++ java-native-interface

我正在使用 JNI 从 C++ 代码调用 Java 方法。 JNI 提供了一个名为 ExceptionDescribe() 的 API,它主要是在 stderr 上打印堆栈跟踪。示例代码片段:-

JNIEnv** ppObjJNIEnv;
.....
.....
// some java method call using CallObjectMethod() or CallVoidMethod API
if (JNI_TRUE == (*ppObjJNIEnv)->ExceptionCheck()) {
    (*ppObjJNIEnv)->ExceptionDescribe();
    return -1;
}

但我想在某些日志文件或(比如)系统日志中记录异常。

有什么办法吗?

最佳答案

我没有尝试过,但我认为您需要使用 JNI 或 Java 将 System.stderr 重定向到另一个流(即您的日志文件)。

理论上,您应该能够以这样的方式从 JNI 执行此操作:

  • 保存对当前 System.stderr 的引用
  • 创建一个新流(您可能需要缓存它,如果缓存它,则使用全局引用来避免 GC)。如果它已缓存并已打开,那么当然可以使用它。
  • 将 System.stderr 设置为新流,它只是系统中的一个静态字段。
  • 调用电话以获取异常详细信息
  • 将 System.err 恢复到它保存的值
  • 刷新并(可选)关闭您的流(如果您未将其保持打开状态)。

正如我所说,我自己还没有尝试过,但如果我想这样做,我会自己尝试。

关于java - 如何在 C++ 中使用 JNI 将异常堆栈跟踪重定向到日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33743328/

相关文章:

c++ - 默认情况下全局变量是extern还是相当于在全局中用extern声明变量?

java - 如何将 char 数组从 C JNI 函数作为 byte[] 传递给 Java 方法

java - 将 NewDirectByteBuffer 从 C++ 传递到 Java (JNI)

android - Android Studio 中预建的 C 库

java - 更新到最新版本后缺少 Artifact

c++ - 我在 C++11 中从未见过的代码

java - 如何在 GUI 中出现另一个 JOptionPane 时关闭一个 JOptionPane

c++ - 通过 Visual Studio 跟踪更改的文件

java - Jpql 从每组中选择一个最大行

java - Eclipse java 断点 - 目的是什么?