我可以从静态JNI字段中获得数据的内存地址吗?
例如,我有两种情况:
:
jclass clazz = ...;
jfieldID staticFiled = ...; // static field on java object
uintptr_t *staticFiledPtr = ((uint64_t) staticFiled); // get field ptr
jboolean *boolPtr = *magic code with static field*;
*boolPtr = true;
第二:
jclass clazz = ...;
jfieldID staticFiled = ...; // static field on java object
uintptr_t *staticFiledPtr = ((uint64_t) staticFiled); // get field ptr
jobject *objectPtr = *magic code with static field*;
jobject object = *objectPtr;
示例非常简单。我只是想获得静态字段数据上的内存地址,而不使用GetStaticObjectField等。有可能吗?
JVM中的字段没有地址。只有对对象的引用(这些对象是而不是指针),然后在特定的偏移量处访问这些引用以读取或写入字段。
此操作可能涉及解压缩并将引用值添加到堆基地址以获得临时内存地址。它还可能受到GC屏障的保护。也就是说,它不是一个简单的指针解引用。当然,在此操作之外,GC可以自由地移动对象。由于每次访问都由GC屏障保护,甚至引用本身也可能是过时的,因为GC可以延迟更新值,直到访问之前,在GC屏障内。
所以,简而言之,获取字段的地址是不可能的,通过该地址读/写就更不可能了。在最好的情况下,您可以希望获得一些指向Java堆某处的短暂值。