Java 我需要释放在SWIG out类型映射中分配的字节数组吗?

Java 我需要释放在SWIG out类型映射中分配的字节数组吗?,java,c++,java-native-interface,swig,Java,C++,Java Native Interface,Swig,我目前正在使用SWIG将无符号字符*包装为字节[]。我将从C++返回到我的代码的java端。 问题是,我真的不知道为这个数组释放内存的责任是落在本机代码和/或wrap上,还是落在javagc上 现在我正在使用这个(不要介意可怕的黑客获得的大小…: 在这里,NewByteArray看起来完全是一个空白,我不知道是否应该调用ReleaseByteArrayElements,也不知道应该在哪里调用ReleaseByteArrayElements。我找到了,但我不确定这里的情况是否完全相同。Releas

我目前正在使用SWIG将
无符号字符*
包装为
字节[]
。我将从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);
}