如何在 JNI 中查找错误

How to find errors in JNI

更新我们软件中的一些遗留代码,我不得不通过 JNI 更改一些调用。然而,在 运行 几次之后,程序始终在 C++ 中的同一个地方中断,并出现访问冲突错误,这将转移回 Java 变量已设置为 null 的地方,这是不可能发生的在 java 中(如果不清除包含它的 class 就无法将此变量设置为 null)并且它中断的 jni 调用不会触及这部分代码。

每个 JNI 调用都会在它之后检查异常 returns,我的代码现在充满了 assert(*someitem* != NULL); 在检索每个 jclass 和 methodID 并实例化新的 java classes 之后,其中的 none 失败,因此我只能假设故障发生在本地某处代码,只有在返回 java.

时才拾取

我的问题是,我怎样才能找到实际发生问题的地方? 我使用了 -xCheck:jni 什么也没显示,-verbose:jni 和 -verbose:gc 正如类似问题所建议的那样,但无济于事。

抱歉,由于问题的性质,无法使用 SSCCE

对于发现此 post 并且遇到相同问题的任何人,我终于解决了它。

事实证明我在调用中使用了错误的 methodID。我正在重用一个保存我的方法 ID 的变量,当时它持有一个对我调用它的对象有效的构造函数方法,这不会导致任何错误或异常,但是程序的一个关键部分被遗漏了。

希望这对遇到这个可怕问题的其他人有所帮助。