4

NewObjectArray新しいアレイを部分的に埋めている間に障害が発生した場合、結果はどのように処理する必要がありますか?

つまり、作成を中止したいのです。配列へのローカル参照を削除するだけで十分ですか?これで子供も削除されますか?

4

2 に答える 2

4

Javaフィールドに割り当てられているか、JNI関数の戻り値として使用されていない限り、ネイティブ呼び出しが返されると、参照は自動的にガベージコレクションされます。これはローカル参照です-それらはJNI呼び出しを過ぎて生きていません。

于 2012-08-31T01:56:47.690 に答える
0

同じトピック(リリース)を探しているときにこの質問に出くわしましたがjobjectArray、@Sevaから提供された回答が完全ではないことに気付きました。

他の方法と同じように、次を使用して削除できます。jobjectArray LocalRefLocalRef

env->DeleteLocalRef(the_array);
// OR
(*env)->DeleteLocalRef(env, the_array);

もちろん、他のLocalRef場合と同様に、手動削除を回避し、GCに頼って魔法をかけることができますが、同じJNI関数でそれらの多くが必要な場合、またはたとえば、新しいものを割り当てるループを実行している場合JNILocalRefを削除しない場合は、テーブルの制限(かなり低く、512に設定)をオーバーフローすると、問題が発生します。

ノート

DeleteLocalRef配列参照を手動で削除する場合は、上の関数がjobjectArrayその子要素を解放しないことを覚えておく必要があります。

したがって、使用しているときjobjectArrayは、要素を追跡するか、すべての要素をループして、それらを1つずつ削除する必要があります。

同じことがプリミティブ配列にも当てはまりますが、これらには

env->Release<Primitive>ArrayElements(the_array, 
           the_elements_to_remove, 
           release_mode);
// OR
(*env)->Release<Primitive>ArrayElements(env, 
           the_array, 
           the_elements_to_remove, 
           release_mode);
于 2017-05-19T10:03:39.097 に答える