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

时间:2012-05-17 08:07:27

标签: java java-native-interface

好的,这个令人难以置信。

我从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或汇编语言来看看究竟发生了什么?

谢谢,      - 蒂姆。

1 个答案:

答案 0 :(得分:2)

您正在寻找Inner的字段,但您正在提供一个Outer(thisj)的实例作为获取它们的地方。

相关问题