0
我目前使用SWIG将unsigned char*
作为byte[]
包装。我将这种类型从C++返回到我的代码的Java端。我是否需要释放在SWIG输出类型图中分配的ByteArray?
事情是,我真的不知道为这个数组释放内存的责任落在本地代码和/或wrap上,还是在Java GC上。
现在,我使用这个(不介意的可怕黑客获得大小...):
%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);
}
这里,NewByteArray
看起来完全在野外,我不知道我应该打电话给ReleaseByteArrayElemements
。我发现this answers,但我不确定这里的情况是否完全相同。
对我来说没关系。 '$ result'持有对字节数组的本地引用,除非创建了很多这样的引用(例如在一个循环中),否则您不应该显式删除本地引用,否则您有冒险填充本地引用表的风险。 – Michael
所以当我这样做时:'jenv-> NewByteArray(length)'和“return”'$ result',JVM获得该内存的所有权并且将它GC? – JBL
这就是如果你从一个纯粹的本地函数做到这一点会发生什么。所以,除非SWIG插入一些额外的代码,在幕后创建全局引用,否则我会说这段代码将正常工作。我想你可以做一个测试,你可以在你创建一个你自己的某个类的'NewObject'的地方,你可以重写'finalize()'并且在对象完成时记录。 – Michael