3

Android のソース コードを調べていたところ、フレームワークには static{System.loadLibrary()} を使用せずにネイティブ コードを使用している場所がたくさんあることがわかりました。

たとえば、SystemServer.java では、ネイティブ メソッド「init1(args)」が呼び出されますが、ファイルに static{System.loadLibrary()} はありません。static{System.loadLibrary()} なしでネイティブ コードをロードする方法は? ありがとう。

4

2 に答える 2

2

ネイティブ ライブラリは、アプリケーション全体で 1 回だけロードする必要があるため、以前にインスタンス化された別のクラスによって既にロードされている可能性があります。クラスが呼び出される順序を仮定しているため、これはベスト プラクティスではないことに注意してください。

これを回避するために一般的に使用される手法は、Loader次のようなクラスを作成することです。

class Loader {
    private static boolean done = false;

    protected static synchronized void load() {
        if (done)
            return;

        System.loadLibrary("library_name");

        done = true;
    }
}

このようにstatic{Loader.load();}して、ネイティブ関数の使用を必要とするすべてのクラスを呼び出す場合、ライブラリが (一度だけ) ロードされていることを確認します。

于 2013-05-02T09:36:21.693 に答える