在 C/C++ 中获取 Java 对象的内存地址

get memory address of java object in c/c++

本文关键字:对象 内存 地址 Java 获取 C++      更新时间:2023-10-16

假设我有一个java类

class NativeInterface{
    public static native void access(Object obj);
}

我想做的只是访问该对象的第二个字节(例如(。

即我想做这样的事情:

#include<jni.h>
#include "NativeInterface.h"
#include <stdio.h>
using byte = unsigned char;
/*
* Class:     NativeInterface
* Method:    access
* Signature: (Ljava/lang/Object)V
*/
JNIEXPORT void JNICALL Java_NativeInterface_access(JNIEnv* env, jclass _obsolete, jobject obj){
    byte byte_array[] = obj;
    printf("%c",byte_array[2]);
}

现在显然,这是行不通的。 obj甚至可能不是 java 对象。(jobject在 jni.h 中定义,我还没有弄清楚它的作用。

那么我该怎么做呢?

(尝试这种幼稚的尝试将导致

error: initializer fails to determine size of ‘byte_array’
     byte byte_array[] = obj;
                         ^~~~

,顺便说一句。

"obj甚至可能不是Java对象">

你自己差点想通了。它只是比这强一点。Java有垃圾回收。仅出于这个原因,您就知道obj不是 java 对象,而只是一个句柄,当垃圾回收器在内存中随机播放该对象时

,该对象引用该对象。您

现在看到了问题中的基本缺陷:"获取 java 对象的内存地址"假定您获得了有用的值。但即使你能得到一个地址,从你得到它后的第一个时钟滴答声开始,它也是不可靠的。