我目前正在使用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但我不确定这是否完全相同。
答案 0 :(得分:0)
ReleaseByteArrayelements
与GetByteArrayElements
一起使用,因此您在此处不需要它
你不需要任何东西。一旦没有对它的引用,该数组将被Java垃圾收集器释放。