好的,这个令人难以置信。
我从GetObjectField()的两次调用之一得到一个null返回。每个对象都是DirectByteBuffer。该调用不会因未能找到该字段而引发异常,但它会返回NULL。
这是一个特殊的部分 - 如果我改变内部类中字段定义的顺序,我会看到从源到dest的null变化。
这是一个将问题简化为本质的代码的解释。
public class Outer {
private native int submitInner(Inner submission);
private static class Inner {
private int status;
private ByteBuffer source;
private ByteBuffer dest;
private Outer outer;
Inner(Outer outer, ByteBuffer source, ByteBuffer dest) {
this.outer = outer;
this.source = source;
this.dest = dest;
status = 0;
}
}
原生代码。为简洁起见,我在这里剪掉了字段id。我只想说问题从一个字段移动到另一个字段而不触及这些字段,所以可能是字段id很好。
JNIEXPORT jint JNICALL Java_Outer_submitInner
(JNIEnv *env, jobject thisj, jobject inner ) {
jobject source = (*env)->GetObjectField(env, thisj, Inner_source);
jobject dest = (*env)->GetObjectField(env, thisj, Inner_dest);
jobject outer = (*env)->GetObjectField(env, thisj, Inner_outer);
printf("%016llx %016llx %016llx\n", (long long)source, (long long)dest, (long long)outer);
...
任何人都有任何想法可以理解吗?
有任何调试建议吗?我正在从日食中走过java。有没有办法通过C或汇编语言来看看究竟发生了什么?
谢谢, - 蒂姆。
答案 0 :(得分:2)
您正在寻找Inner的字段,但您正在提供一个Outer(thisj)的实例作为获取它们的地方。