1

私は最近、Android JNI アプリケーションで API レベル 14 をターゲットにし始めましたが、ここで説明されている問題をすぐに発見しました。

ローカル参照を明示的に管理しても問題を解決できなかったので (私の実験の最後にローカル参照テーブルのオーバーフローが発生しました)、単純にグローバル参照に切り替えることにしました。現在、その記事に記載されていない「古いグローバル参照を使用しようとする」問題が発生しています。

これが私がやろうとしていることです: jobjects のコンテナーを持つ単一のオブジェクトがあります。Java がネイティブ メソッドを呼び出し、後で使用するために保存する必要がある参照を渡すたびに、その参照に新しいグローバル ref を作成jobjectし、コンテナーにグローバル ref を追加して、そのインデックスも保存します。を使用する必要があるときはいつでもjobject、インデックスで取得します。このアプローチの問題は何ですか?

PS JNIメソッドを呼び出すときはいつでもJNIEnv、呼び出し元のスレッドに正しいものを使用しています。JNI 呼び出しを行うスレッドは JVM に接続されます。

4

2 に答える 2

1

Java メソッドで、含まれている jobject への参照をすべてのネイティブ メソッドに渡すようにします。そうすれば、常に自動的に正しくなり、 にするGlobalRef必要がまったくないため、ローカル変数テーブルのオーバーフローが発生したり、 などを心配したりする必要がまったくありませんDeleteGlobalRef()

于 2013-02-03T03:50:59.443 に答える
1

ローカル参照を明示的に管理して問題を解決できませんでした (実験の最後にローカル参照テーブルのオーバーフローが発生しました)

あなたのコードには、より深い問題の匂いがします。現在の JNI 呼び出しから戻る前に、手動で適切に作成および削除しているすべてのローカル参照を認識している場合、ローカル参照テーブルのオーバーフローは発生しません。ローカル ref の作成は非常に微妙な場合がありますが、それだけではありませんFindClass

とにかく、グローバル参照で動作させたい場合(あなたが説明した使用シナリオを考えると、とにかく正しいことのように思えます)、私はこれを疑っています:あなたの「コンテナ」は、保存された参照を単に削除するだけでなく、時々削除する必要があります追加したと思います。正しいものを削除し、正しいものを呼び出していることを確信していますDeleteGlobalRefか? コンテナーに残っている他のものではありませんか? 別の言い方をNewGlobalRefすれば、コード内のそれぞれについて、関連する場所がどこにあるかを確認し、DeleteGlobalRefいつ、なぜ呼び出されているかについて確信を持っていることを確認してください。

于 2013-02-01T09:22:40.903 に答える