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を見つけましたが、私はそれがまったく同じ場合にはわかりません。
私によく見えます。 '$ result'はバイト配列へのローカル参照を保持していますので、ローカル参照テーブルを埋める危険性の高いもの(ループなど)をたくさん作成しない限り、ローカル参照を明示的に削除する必要はありません。 – Michael
それでは、 'jenv-> NewByteArray(length)'と 'return" '$ result'を実行すると、JVMはそのメモリの所有権を取得し、それをGCしますか? – JBL
これは、プレーンなネイティブ関数からこれを行った場合に起こります。したがって、SWIGがバックグラウンドで世界的なリファレンスを作成するいくつかの追加コードを挿入していない限り、このコードはうまく動作すると思います。あなたが 'finalize()'をオーバーライドしたクラスの 'NewObject'を作成し、オブジェクトがファイナライズされるときにログするテストを行うことができると思います。 – Michael