2017-04-24 9 views
0

私は現在unsigned char*byte[]としてラップするのにSWIGを使用しています。私はこのタイプをC++からコードのJava側に戻しています。SWIGのtypemapに割り当てられたByteArrayを解放する必要がありますか?

この配列のメモリを解放する責任がネイティブコードやラップ、または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がバックグラウンドで世界的なリファレンスを作成するいくつかの追加コードを挿入していない限り、このコードはうまく動作すると思います。あなたが 'finalize()'をオーバーライドしたクラスの 'NewObject'を作成し、オブジェクトがファイナライズされるときにログするテストを行うことができると思います。 – Michael

答えて

0

ReleaseByteArrayelementsGetByteArrayElementsと一緒に使用されるため、ここでは必要ありません。
無料で何かをする必要はありません。 Javaガベージコレクタは、参照がなくなるとその配列を解放します。

関連する問題