0

私は2つのクラスを持っています:

public class UThreadApp {
    public static void main(String[] args) {
        newUThread("umain", args);
            ...
    }
    native void newUThread(String method, String[] args);
}

public class App extends UThreadApp {
    public static void umain(String[] args) {
        ...
    }
}

アプリケーションは として実行されjava Appます。

Appが呼び出すようなものmainから継承します。JNIコードから呼び出すには、JavaまたはJNIからメインクラス名をプログラムで取得する必要があります。それを行う方法はありますか?UThreadAppmainApp.umainAppApp.umain

new Object(){}.getClass().getEnclosingClass()返されてから機能しないイディオムUThreadApp

4

1 に答える 1

1

静的メソッドにはクラスも参照もありませんthis。クラスAppは、メインが通常同様に呼び出し可能である限り、メインを「継承」App.mainします。しかし、常識的に静的メソッドをオーバーライドすることはできません。メソッドが呼び出されると、呼び出しに使用された名前を特定する方法はありません。したがって、Java 側またはネイティブ コードで何をしても、必要な情報は得られません。Java 実行可能ファイルをハッキングし、そのコマンド ライン引数または同様の残忍でサポートされていないアプローチを把握することは別として、つまり、.

注:main staticが non-static を呼び出そうとするエラーもありますnewUThread

staticスコープを離れて適切なthisポインターを取得するには、次のようなことができます。

public class UThreadApp {
    protected void UThreadApp(String[] args) {
        newUThread("umain", args);
            ...
    }
    native void newUThread(String method, String[] args);
}

public class App extends UThreadApp {
    public void main(String[] args) {
        new App(args);
    }
    public App(String[] args) {
        super(args);
    }
}
于 2012-07-20T21:19:50.080 に答える