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