2

Android アプリケーションの問題を突き止めようとしています。この問題により、コードのネイティブ層でのガベージ コレクション中にクラッシュが発生します。私は自分自身を説明します。

私のアプリケーションは、GUI 要素などを制御する Java ソースと、アプリケーションのレンダリングやその他のパフォーマンスが重要な部分を管理するネイティブ ライブラリだけで構成されています。レンダリング用の GLSurfaceView を備えています。

Java レイヤーはネイティブ オブジェクトにアクセスしてインスタンス化できる必要があるため、これらは Swig を介して Java に公開されます。Swig が行うことは、(Java の) 各ラッパー クラスで、ネイティブの削除演算子を呼び出す finalize メソッドを生成することです。

次の擬似コードを検討してください。

C++ の場合:

class MyClass {

    public:

        MyClass () {}

        ~MyClass ()
        {
            print("deleting MyClass instance");
            print("doing 1");
            do1();
            print("doing 2");
            do2();
            print("doing 3");
            do3();
            print("instance deleted");
        }
};

これは、たとえば「print」が Android logcat の print を表すことを意味する疑似コードです。

私を困惑させているのは、ガベージコレクターが実行され、場合によってはデストラクタを呼び出すと、出力が複数のデストラクタ間でインターリーブされていることがわかります(まるでそれらが同時に削除されているかのように)。この例では、次のようになります。

deleting MyClass instance
doing 1
deleting MyClass instance
doing2
doing1
doing2
deleting MyClass instance
doing3
doing3
instance deleted
doing1
doing2
instance deleted
doing3
instance deleted

同時に、logcat は、これらのメッセージが同じスレッド (ファイナライザー スレッド) から発信されたことを明確に示しています。

したがって、私の質問:「単一のスレッドが複数のネイティブ呼び出しを同時に実行するにはどうすればよいですか?」

4

1 に答える 1

0

ネイティブ デストラクタは VM にコールバックしますか?

于 2013-10-25T06:40:56.363 に答える