如何在JNI中发现错误

How to find errors in JNI

本文关键字:发现 错误 JNI      更新时间:2023-10-16

更新我们软件中的一些遗留代码,我不得不通过JNI更改一些调用。然而,在运行它几次之后,程序始终在c++中的相同位置中断并出现访问冲突错误,这转移回Java,其中变量已被设置为null,这不会在Java中发生(没有办法将该变量设置为null而不清理包含它的类),并且它中断的jni调用不会触及这部分代码。

每个JNI调用返回后检查异常,我的代码现在充满了assert(*someitem* != NULL);在检索每个jclass和methodID并实例化新的java类之后,它们都没有失败,因此我只能假设错误发生在本机代码中的某个地方,并且只有在返回java时才会被捡起。

我的问题是,我怎样才能找到问题实际发生的地方?我使用了-xCheck:jni,没有显示任何东西,-verbose:jni和-verbose:gc,但都无济于事。

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

对于任何发现这篇文章并有同样问题的人,我终于修复了它。

结果是我在调用中使用了错误的方法。我重用了一个保存我的methodid的变量,在有问题的时候,它保存了一个对我调用它的对象有效的构造函数方法,这不会导致错误或异常,但是程序的关键部分被遗漏了。

希望这篇文章能帮助到那些有这个可怕问题的人。