如何在 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 的变量,当时它持有一个对我调用它的对象有效的构造函数方法,这不会导致任何错误或异常,但是程序的一个关键部分被遗漏了。
希望这对遇到这个可怕问题的其他人有所帮助。
更新我们软件中的一些遗留代码,我不得不通过 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 的变量,当时它持有一个对我调用它的对象有效的构造函数方法,这不会导致任何错误或异常,但是程序的一个关键部分被遗漏了。
希望这对遇到这个可怕问题的其他人有所帮助。