Java 我需要释放在SWIG out类型映射中分配的字节数组吗?
我目前正在使用SWIG将Java 我需要释放在SWIG out类型映射中分配的字节数组吗?,java,c++,java-native-interface,swig,Java,C++,Java Native Interface,Swig,我目前正在使用SWIG将无符号字符*包装为字节[]。我将从C++返回到我的代码的java端。 问题是,我真的不知道为这个数组释放内存的责任是落在本机代码和/或wrap上,还是落在javagc上 现在我正在使用这个(不要介意可怕的黑客获得的大小…: 在这里,NewByteArray看起来完全是一个空白,我不知道是否应该调用ReleaseByteArrayElements,也不知道应该在哪里调用ReleaseByteArrayElements。我找到了,但我不确定这里的情况是否完全相同。Releas
无符号字符*
包装为字节[]
。我将从C++返回到我的代码的java端。
问题是,我真的不知道为这个数组释放内存的责任是落在本机代码和/或wrap上,还是落在javagc上
现在我正在使用这个(不要介意可怕的黑客获得的大小…:
在这里,
NewByteArray
看起来完全是一个空白,我不知道是否应该调用ReleaseByteArrayElements
,也不知道应该在哪里调用ReleaseByteArrayElements。我找到了,但我不确定这里的情况是否完全相同。ReleaseByteArrayelements
与GetByteArrayElements
一起使用,所以这里不需要它。
你不需要释放任何东西。一旦没有对数组的引用,Java垃圾回收器就会释放该数组。在我看来还可以$result
保存对字节数组的本地引用,除非创建了太多的本地引用(例如,在循环中),否则不必显式删除本地引用,否则可能会填充本地引用表。因此,当我这样做时:jenv->NewByteArray(length)
和“return”$result
,JVM拥有该内存的所有权,并将对其进行GC?如果您从一个普通的本机函数执行此操作,就会发生这种情况。所以,除非SWIG插入一些额外的代码,在幕后创建一个全局引用,否则我认为这段代码可以正常工作。我想你可以做一个测试,创建一个属于你自己的类的NewObject
,在这个类中你已经覆盖了finalize()
,并在对象完成后记录。好的,谢谢你的洞察力!
%typemap(jni) unsigned char * Image::getPixels "jbyteArray"
%typemap(jtype) unsigned char * Image::getPixels "byte[]"
%typemap(jstype) unsigned char * Image::getPixels "byte[]"
%typemap(javaout) unsigned char * Image::getPixels{
return $jnicall;
}
%typemap(out) unsigned char * Image::getPixels {
//There must be a proper way than using an implicit local variable name
//from the generated cxx file...
size_t length = arg1->getBpp() * arg1->getWidth() * arg1->getHeight();
$result = jenv->NewByteArray(length);
jenv->SetByteArrayRegion($result, 0, length, (const signed char*)$1);
}