c - JNI ThrowNew 什么时候会失败?

标签 c exception java-native-interface

来自 JNI 文档,

jint ThrowNew(JNIEnv *env, jclass clazz,
    const char *message);

[...]

RETURNS: Returns 0 on success; a negative value on failure.

这个函数在什么情况下会失效?堆栈空间不足、堆不足等似乎是常见的嫌疑人,但是否有任何灾难性较小的运行时条件会导致此失败?传递的参数无效,当然,但我会考虑那些程序员错误。

换句话说,我是否有理由断言 ThrowNew() 的返回值?例如

jint res = (*env)->ThrowNew(env, clazz, msg);
assert(res == 0);

最佳答案

正如 EJP 在他的回答中所观察和证明的那样,ThrowNew 可能会失败的原因有很多。

然而,关于您的后续问题:

In other words, would I be justified in asserting the return value of ThrowNew()?

我想你的想法是 ThrowNew() 的失败无论如何都是不可恢复的,所以你不需要担心检测它,除了调试目的。显然,这不是一个安全的假设。

另一方面,由于 ThrowNew() 的明确目的是在 JNI 环境中引发异常,因此调用线程的无条件义务该函数以避免在从 native 方法返回之前随后调用任何其他 JNI 函数。即使您不确定 ThrowNew() 引发了任何异常,如果事实上它没有引发,您也无能为力。由于在 ThrowNew() 之后线程行为的变化范围很小(如果有的话),我认为 assert() 其返回值不是问题(当然,没有断言整个调用)。

关于c - JNI ThrowNew 什么时候会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35303303/

相关文章:

java - Windows下JNI和C入门

java - 奇怪的乐观锁异常

java - 如果没有 catch block ,哪个异常处理程序将处理异常?

c - 重复代码的分离 - common.h 文件 - 带有自定义参数的函数声明

在c中创建具有不同子进程的n父进程

c++ - 从 stdexcept 类继承时为 "Undefined Symbols"

java - Eclipse 是否必须处理 C++ ABI 兼容性问题?

c - 有限状态机/Android NDK JNI

c - 读取文件并存储在数组中

c - 为什么程序的输出是不同的?