Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取c/c+中java对象的内存地址+;_Java_C++_C_Pointers_Java Native Interface - Fatal编程技术网

获取c/c+中java对象的内存地址+;

获取c/c+中java对象的内存地址+;,java,c++,c,pointers,java-native-interface,Java,C++,C,Pointers,Java Native Interface,假设我有一个java类 class NativeInterface{ public static native void access(Object obj); } 我只想访问该对象的第二个字节(例如) 也就是说,我想做这样的事情: #include<jni.h> #include "NativeInterface.h" #include <stdio.h> using byte = unsigned char; /* * Class: Native

假设我有一个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对象”

你自己差点就搞定了。它只是比那强一点。Java有垃圾收集功能。仅出于这个原因,您就知道,
obj
不是java对象,而仅仅是一个句柄,当垃圾收集器在内存中随机移动该对象时,它引用该对象


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

您不能分配给数组,也不能从数组初始值设定项以外的其他内容初始化它!请参阅您的文档
jobject
到底是什么,类似于
char*objbytes=obj
的东西可能会起作用。我同意它不是java对象,我不同意如果我能得到地址,它“从第一个时钟开始就不可靠”。请参阅我的后续问题:@User1291:您正在查看幕后的JNI代码,它阻止对象在JNI分配
Int
时移动。我不明白您的意思。如果您是正确的,那么不安全的实现如何在执行时不采取任何措施来“阻止对象移动”呢?@User1291:这是另一个不正确的假设。JNI是JVM的一部分,它确实阻止对象移动。这并不奇怪,JVM必须阻止对象移动,不管是谁在调用对象上的方法。谢谢。我试图最终在RTM事务中执行它是否重要(请参阅)?我不完全确定,但我假设在获取地址的过程中读取的至少一个值在移动时必须更改,即s.t。事务中止,可以重试。因此,如果我们以事务方式解析地址并访问/修改同一事务中的位置。。。那应该行吗?
error: initializer fails to determine size of ‘byte_array’
     byte byte_array[] = obj;
                         ^~~~