从JNI文档中,

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

[...]
返回:
成功时返回0;失败时返回负值。
在什么情况下这个功能会失败?堆栈空间不足、堆外等似乎是常见的问题,但是否有任何灾难性较小的运行时条件会导致此失败?当然,传入的参数无效,但我会考虑那些程序员错误。
换句话说,我断言ThrowNew()的返回值是否合理?例如
jint res = (*env)->ThrowNew(env, clazz, msg);
assert(res == 0);

最佳答案

正如EJP在他的回答中观察到并证明的,有很多非灾难性的原因可以解释为什么ThrowNew可能失败。
至于你的后续问题:
换句话说,我断言ThrowNew()的返回值是否合理?
我想您的想法是ThrowNew()的失败无论如何都是不可恢复的,所以您不必担心检测它,除了调试目的。显然,这不是一个安全的假设。
另一方面,由于ThrowNew()的明确目的是在JNI环境中引发异常,因此调用该函数的线程无条件地有义务在从本机方法返回之前避免随后调用任何其他JNI函数。即使您不确定ThrowNew()是否引发了任何异常,但如果事实上没有,您也无能为力。由于在ThrowNew()之后线程的行为几乎没有(如果有的话)变化的范围,所以我认为assert()其返回值(当然,没有断言整个调用)不是问题。

09-27 14:27