在我们的软件中更新一些遗留代码,我不得不通过JNI改变一些调用。但是,在运行它几次之后,程序在c ++中的同一个地方一直出现访问冲突错误,这会转移到Java,其中变量已经设置为null,这在java中不会发生(没有办法将此变量设置为null而不清除包含它的类)和它中断的jni调用不会触及此部分代码。
每个JNI调用返回后检查异常,我的代码现在已满assert(*someitem* != NULL);
在检索每个jclass和methodID并实例化新的java类之后,它们都没有失败,因此我只能假设故障发生在本机代码中的某个地方,并且仅在返回到java时才会被接收。
我的问题是,我怎样才能找到问题实际发生的位置? 我使用了-xCheck:jni,它没有显示任何内容,-verbose:jni和-verbose:gc,如同类似问题所示,但无济于事。
很抱歉,由于问题的性质,无法进行SSCCE
答案 0 :(得分:0)
对于发现此帖并且遇到同样问题的任何人,我终于修复了它。
事实证明我在通话中使用了错误的methodID。我正在重用一个包含我的methodID的变量,并且当时有问题的是它持有一个对我调用它的对象有效的构造函数方法,这导致没有错误或异常,但程序的关键部分却被遗漏了。
希望如果他们遇到这个可怕的问题,这会对他人有所帮助。