我是否需要释放在SWIG输出类型映射中分配的ByteArray?

时间:2017-04-24 09:53:52

标签: java c++ java-native-interface swig

我目前正在使用SWIG将unsigned char*打包为byte[]。我将这种类型从C ++返回到我的代码的Java端。

事实上,我真的不知道为这个数组释放内存的责任是在本机代码和/或包装上,还是在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看起来完全在野外,我不知道是否应该拨打ReleaseByteArrayElements。我发现this answers但我不确定这是否完全相同。

1 个答案:

答案 0 :(得分:0)

ReleaseByteArrayelementsGetByteArrayElements一起使用,因此您在此处不需要它 你不需要任何东西。一旦没有对它的引用,该数组将被Java垃圾收集器释放。