1

わかりました、これは私の小さな心を悩ませています。

GetObjectField()への2つの呼び出しのうちの1つからnullが返されます。各オブジェクトはDirectByteBufferです。この呼び出しは、フィールドの検索に失敗しても例外をスローしませんが、同じようにNULLを返します。

これが独特な部分です-内部クラスのフィールドの定義の順序を変更すると、ソースから宛先への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を切り取っています。問題はこれらに触れずに1つのフィールドから別のフィールドに移動すると言えば十分なので、おそらくフィールド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またはアセンブリ言語をウォークスルーして、実際に何が起こっているかを確認する方法はありますか?

ありがとう、-ティム。

4

1 に答える 1

2

あなたはInnerのフィールドを探していますが、それらを取得する場所としてOuter(thisj)のインスタンスを提供しています。

于 2012-05-17T22:15:06.960 に答える