2017-04-24 68 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垃圾回收器釋放。

相關問題