好吧,这个让我的小脑袋感到难以置信。
我从对 GetObjectField() 的两个调用之一中得到一个空返回。每个对象都是一个 DirectByteBuffer。该调用不会因找不到该字段而引发异常,但它仍然返回 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 或汇编语言来了解实际情况?
谢谢, - 蒂姆。