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

时间:2015-11-16 19:43:29

标签: java c++ java-native-interface

我正在使用JNI从c ++代码调用java方法。 JNI提供了一个名为Laravel的API,它基本上在ExceptionDescribe()上打印堆栈跟踪。示例代码段: -

stderr

但是我想在一些日志文件或(例如)syslog中记录异常。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

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

理论上你应该能够以这样的方式从JNI做到这一点:

  • 保存对当前System.stderr的引用
  • 创建一个新流(您可能需要缓存该流,并使用全局引用来避免GC,如果您对其进行缓存)。如果它被缓存并且已经打开,那么当然就是使用它。
  • 将System.stderr设置为该新流,它只是System中的静态字段。
  • 拨打电话以获取例外详情
  • 将System.err恢复为已保存的值
  • 刷新并(可选)关闭您的信息流(如果您没有将其保持打开状态)。

正如我所说,我自己没有尝试过,但如果我想这样做,那就是我自己尝试的。