我目前正试图使用JNI获取内存中字段的偏移量,以便能够将字段值复制到堆内存中。我能够使用字段的jFieldID获取实例字段的偏移量。 jFieldID的最重要的30位表示实例字段的字段偏移量。问题在于静态字段。 30位表示一个JNIid *。一个JNIid是一个包含一个int偏移量字段的结构,它可能是该字段的偏移量。现在我的问题是我如何获得这个价值。我用下面的代码段(假定ID是一个字段的jFieldID和address_shift是2)静态字段的JNI字段ID
uintptr_t result = (uintptr_t) id >> address_shift;
// offset field in JNIid struc is in offset 16
jlong staticFieldoffsetAddress = result + 16;
jint* staticFieldValuePointer = (jint*) staticFieldoffsetAddress;
然而,这不给我任何值。我得到0这是不正确的,因为我将它与我从java中的Unsafe.staticFieldOffset(Field)获得的内容进行比较。我知道我可以从JNI调用这个方法并使用结果。但我希望它可以用于关键性能的应用程序。
JNI用于读取字段值提供的功能。我强烈建议您使用这些代替尝试对特定的JNI实现进行反向工程。 –
是的,我知道但我不想逐个复制字段值。所以我想获得最小偏移量和最大值并且做一个副本内存。 –
@MohamedOmer你为什么会认为内存中的偏移不会改变? –