JNI ThrowNew什么时候会失败?

时间:2016-02-09 22:17:56

标签: c exception java-native-interface

来自JNI文档,

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

[...]

     

返回值:   成功时返回0;失败的负​​面价值。

在什么情况下这个功能会失败?堆栈空间,堆外等似乎是通常的嫌疑人,但是有没有更少的灾难性运行时条件会导致失败?传入的参数无效,当然,但我会考虑那些程序员错误。

换句话说,我是否有理由断言ThrowNew()的返回值? e.g。

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

2 个答案:

答案 0 :(得分:2)

  • 内存不足
  • 无效jclass值(例如零)
  • 没有可访问的构造函数采用单个String参数
  • 类本身无法访问
  • 类不会扩展Throwable
  • ...

答案 1 :(得分:2)

正如EJP在他的回答中观察和证明的那样,ThrowNew可能失败的原因有多种非灾难性的原因。

关于你的后续问题:

  

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

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

另一方面,由于ThrowNew()的明确目的是在JNI环境中引发异常,因此线程的无条件义务调用该函数以避免随后在从本机方法返回之前调用任何其他JNI函数。即使你不相信ThrowNew()提出了任何例外情况,但如果事实上它并没有那么多你可以做些什么。由于ThrowNew()之后线索行为的变化范围很小(如果有),我认为assert()的返回值不是if all(not any(row) for row in usedGameboardPosition): start = 0 的问题(当然,没有主张整个电话会议。)