2017-04-24 70 views
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,但我不确定这里的情况是否完全相同。

+0

对我来说没关系。 '$ result'持有对字节数组的本地引用,除非创建了很多这样的引用(例如在一个循环中),否则您不应该显式删除本地引用,否则您有冒险填充本地引用表的风险。 – Michael

+0

所以当我这样做时:'jenv-> NewByteArray(length)'和“return”'$ result',JVM获得该内存的所有权并且将它GC? – JBL

+2

这就是如果你从一个纯粹的本地函数做到这一点会发生什么。所以,除非SWIG插入一些额外的代码,在幕后创建全局引用,否则我会说这段代码将正常工作。我想你可以做一个测试,你可以在你创建一个你自己的某个类的'NewObject'的地方,你可以重写'finalize()'并且在对象完成时记录。 – Michael

回答

0

ReleaseByteArrayelementsGetByteArrayElements一起使用,所以你在这里不需要它。
你不需要释放任何东西。一旦没有对它的引用,该数组将被Java垃圾回收器释放。

相关问题