在 C/C++ 中获取 Java 对象的内存地址
get memory address of java object in c/c++
假设我有一个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 对象的内存地址"假定您获得了有用的值。但即使你能得到一个地址,从你得到它后的第一个时钟滴答声开始,它也是不可靠的。
相关文章:
- 迭代时从向量和内存中删除对象
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 对具有动态分配的内存和析构函数的类对象的引用
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 内存清理程序报告全局对象构造中未初始化值的使用
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 准确了解对象在内存中的映射方式
- 完全释放静态对象内存
- C++ 对象内存管理
- 循环中的自动变量和自动对象内存分配
- 每个对象内存分配有多少开销
- 是隐式创建的默认构造函数,负责分配对象内存
- 使用 make_unique 语句重新分配unique_ptr对象 - 内存泄漏
- C++对象内存布局
- C++对象内存消耗
- 谷歌模拟全局模拟对象内存泄漏
- 静态工厂方法和静态对象内存泄漏
- 关于对象内存布局的假设
- 如果我在管理C++对象内存的目标 C 中混合C++代码,ARC 会处理它