わかりました、これは私の小さな心を悩ませています。
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またはアセンブリ言語をウォークスルーして、実際に何が起こっているかを確認する方法はありますか?
ありがとう、-ティム。