我正在使用 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/