如何从JNI、Java和C+中释放用jShortArray/jByteArray分配的内存+;

如何从JNI、Java和C+中释放用jShortArray/jByteArray分配的内存+;,java,c++,java-native-interface,jnienv,Java,C++,Java Native Interface,Jnienv,我试图释放被指定为虚拟变量的t_数据的内存。(代码如下)。现在,只要我释放t_数据,程序就会抛出一个堆损坏错误,但如果我将所有内容从body复制到t_数据的新内存中,则一切正常。delete代码在另一个类方法(此处未显示)中的某个位置被调用,它只使用t_数据指针来删除内存 jshortArray val = (jshortArray)(m_pJVMInstance->m_pEnv->CallStaticObjectMethod(m_imageJ_cls, method_id, arr

我试图释放被指定为虚拟变量的t_数据的内存。(代码如下)。现在,只要我释放t_数据,程序就会抛出一个堆损坏错误,但如果我将所有内容从body复制到t_数据的新内存中,则一切正常。delete代码在另一个类方法(此处未显示)中的某个位置被调用,它只使用t_数据指针来删除内存

jshortArray val = (jshortArray)(m_pJVMInstance->m_pEnv->CallStaticObjectMethod(m_imageJ_cls, method_id, arr, (jint)t, (jint)c));
jsize len = m_pJVMInstance->m_pEnv->GetArrayLength(val);
jshort* body = m_pJVMInstance->m_pEnv->GetShortArrayElements(val, 0);       
unsigned short int* dummy = reinterpret_cast<unsigned short int*>(body);
//t_data = dummy; //NOTE: Once you free t_data later exception is thrown.
t_data = new unsigned short int[len];
for (int i = 0; i < len; i++) {
    unsigned short int test = *(body + i);
    *((unsigned short int*)t_data + i) = test;
}
jshortaray val=(jshortaray)(m_pJVMInstance->m_pEnv->CallStaticObjectMethod(m_imageJ_cls,method_id,arr,(jint)t,(jint)c));
jsize len=m_pJVMInstance->m_pEnv->GetArrayLength(val);
jshort*body=m_pJVMInstance->m_pEnv->GetShortArrayElements(val,0);
无符号短整型*伪=重新解释铸件(主体);
//t_数据=虚拟//注意:释放t_数据后,将引发异常。
t_data=新的无符号短整数[len];
对于(int i=0;i

我正在试图找到一种方法,我不必运行for循环来将body数据复制到t_数据,并且仍然能够释放内存。(对于大图像来说,for循环花费了太多的时间。)

Michael所说的是正确的,这确实解决了问题。关于他的评论:

是的,绝对不要对GetShortArrayElements返回的指针调用free或delete,因为您不知道GetShortArrayElements在内部做了什么。它可能根本没有分配任何内存。一些实现只是固定Java数组以避免GC移动它,然后返回指向实际Java数组内容的指针。完成指针操作后,只需调用ReleaseShortArrayElements即可迈克尔


查看文档,找出谁负责删除
正文
。我不是JNI大师,但垃圾收集器很可能为您管理它。不要
删除
东西,除非您分配了它或者API文档说您有责任删除它。首先不要分配它。快速查看主题表明数组的内存已锁定到位,直到调用
ReleaseShortArrayElements
。再一次,在适当的文档页面上查找详细信息。上帝保佑,真正了解这些东西的人可以过来给我们一个真正的答案。如果没有,看看你是否可以通过将你的工作和研究结果转化为答案来帮助其他遇到这个问题的程序员。相反,我会专注于找出一种方法来获得所需的功能,而不必首先使用
t_data
。(这需要更多的上下文。)是的,绝对不要对
GetShortArrayElements
返回的指针调用
free
delete
,因为您不知道
GetShortArrayElements
在内部做了什么。它可能根本没有分配任何内存。一些实现只是固定Java数组以避免GC移动它,然后返回指向实际Java数组内容的指针。完成指针操作后,只需调用
ReleaseShortArrayElements