Java JNI GetObjectField()为两个DirectByteBuffer之一返回NULL

Java JNI GetObjectField()为两个DirectByteBuffer之一返回NULL,java,java-native-interface,Java,Java Native Interface,好吧,这件事让我难以置信 我从对GetObjectField()的两个调用中的一个调用中得到一个null返回。每个对象都是DirectByteBuffer。该调用不会因为找不到字段而引发异常,但仍然返回NULL 这里有一个特殊的部分——如果我改变了内部类中字段定义的顺序,我会看到从source到dest的null变化 下面是对代码的解释,以将问题归结为本质 public class Outer { private native int submitInner(Inner submission

好吧,这件事让我难以置信

我从对GetObjectField()的两个调用中的一个调用中得到一个null返回。每个对象都是DirectByteBuffer。该调用不会因为找不到字段而引发异常,但仍然返回NULL

这里有一个特殊的部分——如果我改变了内部类中字段定义的顺序,我会看到从source到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);
...
有人有什么想法来解释这件事吗

对调试它有什么建议吗?我正在浏览eclipse中的java。有没有办法通过C或汇编语言来了解实际情况

谢谢,
-Tim.

您正在查找内部的字段,但您提供了外部的实例(thisj)作为获取它们的位置。

submitInner()的Java声明是什么?对。看来婴儿带着洗澡水出去了。我更新了原始片段,添加了声明,谢谢。哇,我真是太蠢了。非常感谢你抓住了那个!