NewObjectArray
新しいアレイを部分的に埋めている間に障害が発生した場合、結果はどのように処理する必要がありますか?
つまり、作成を中止したいのです。配列へのローカル参照を削除するだけで十分ですか?これで子供も削除されますか?
NewObjectArray
新しいアレイを部分的に埋めている間に障害が発生した場合、結果はどのように処理する必要がありますか?
つまり、作成を中止したいのです。配列へのローカル参照を削除するだけで十分ですか?これで子供も削除されますか?
Javaフィールドに割り当てられているか、JNI関数の戻り値として使用されていない限り、ネイティブ呼び出しが返されると、参照は自動的にガベージコレクションされます。これはローカル参照です-それらはJNI呼び出しを過ぎて生きていません。
同じトピック(リリース)を探しているときにこの質問に出くわしましたがjobjectArray
、@Sevaから提供された回答が完全ではないことに気付きました。
他の方法と同じように、次を使用して削除できます。jobjectArray LocalRef
LocalRef
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);