-1 c++ java java-native-interface field memory-address
我可以从静态 JNI 字段获取数据的内存地址吗?
比如我有2种情况:
第一的:
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;
Run Code Online (Sandbox Code Playgroud)
第二:
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;
Run Code Online (Sandbox Code Playgroud)
这些例子非常简单。我只想获取静态字段数据的内存地址,而不使用 GetStaticObjectField 等。这可能吗?
JVM 中的字段没有地址。仅存在对对象(不是指针)的引用,然后以特定偏移量访问这些引用以读取或写入字段。
此操作可能涉及解压缩并将引用值添加到堆基地址以获得临时内存地址。它还可能受到 GC 屏障的保护。即它不是一个简单的指针取消引用。当然,在此操作之外,GC 可以自由移动对象。由于每次访问都受到 GC 屏障的保护,因此即使引用值本身也可能已过时,因为 GC 可以将更新值推迟到访问之前的 GC 屏障内。
因此,简而言之,获取字段的地址实际上是不可能的,并且通过该地址读取/写入更不可能。最好的情况下,您可以希望获得一些指向 Java 堆中某处的临时值。