如何捕获JNI/Java异常
我的应用程序中有一个JNI层。在某些情况下,Java抛出异常。如何在JNI层中获得Java异常?我有如下代码
if((*(pConnDA->penv))->ExceptionCheck(pConnDA->penv))
{
(*(pConnDA->penv))->ExceptionDescribe(pConnDA->penv);
(*(pConnDA->penv))->ExceptionClear(pConnDA->penv);
}
这段代码是否只捕获JNI异常?异常描述将记录在控制台(stderr)的何处?如何将其放入缓冲区,以便将其传递给记录器模块
# 1 楼答案
这是Elliott Hughes' answer的一个补充。我的回答提供了一个逐步的例子,说明如何捕获异常,以及如何使用JNI层在C++和java字之间转换它们。p>
简短回答
请参阅正确的Elliott Hughes' answer
可重用示例
为了便于重用,这个答案和代码片段位于公共域或CC0中。这里所有的源代码都是C++03向后兼容的
要重用上述代码段,请执行以下操作:
my.group.mypackage.Exception
,则将"my/group/mypackage/Exception"
替换为"java/lang/RuntimeException"
李>捕获Java中的异常
另见snippet on coliru
<>我感谢Mooing Duck对上面C++代码的贡献。调整JNI生成的源代码
以下文件
Java_my_group_mypackage_example.cpp
使用上述rethrow_cpp_exception_as_java_exception()
函数:相应的Java代码
文件
example.java
注:“
my-DLL-name
”指的是由上述编译的C/C++代码生成的动态库。它可以是Windows上的my-DLL-name.dll
,也可以是GNU/Linux/Unix上的my-DLL-name.so
台阶
从
example.java
生成example.class
(使用javac
或maven或您最喜欢的IDE Eclipse/Netbeans/IntelliJ IDEA/…)使用
javah
# 2 楼答案
如果从JNI调用Java方法,如果Java抛出异常,那么之后调用
ExceptionCheck
将返回JNI_TRUE
如果您只是调用一个JNI函数(比如
FindClass
),ExceptionCheck
将告诉您该函数是否失败,并留下一个挂起的异常(正如FindClass
在出错时所做的那样)ExceptionDescribe
输出到stderr。没有方便的方法可以让它去其他地方,但是ExceptionOccurred
给了你一个jthrowable
如果你想玩它,或者你可以让它去Java并在那里处理。这是通常的风格:请注意,返回的值并不重要;调用的Java代码永远不会看到它,而是会看到挂起的异常