0

クラス ファイルのみの Java ベンチマークがいくつかあります。

どのベンチマークに JNI 呼び出しがあるかを知りたいです。

の助けを借りてバイトコードレベルからこれを行うことができるのではないかと思いましたが、よくわかりjavap -cません。

何か案は?

4

4 に答える 4

7

クラスのロードが許可されている場合は、リフレクションを使用できます。

Class<?> clazz = ...
List<Method> nativeMethods = new ArrayList<>();
for (Method m : clazz.getDelcaredMethods()) {
    if(Modifier.isNative(m.getModifiers())) {
        nativeMethods.add(m);
    }
}
于 2013-07-21T20:38:27.423 に答える
2

プログラムでネイティブ(JNI)メソッドを見つけたい場合、元の質問からは不明です。javap を使用すると、次のようなものを使用できます。

javap -private java.awt.image.BufferedImage | grep native
于 2013-07-21T20:42:43.727 に答える
0

これは、あなたが説明した線に沿って機能します:

javah  [options] <classes> -d <dir>
grep -r "JNIEXPORT" <dir>

出力の各行は、JNI エクスポート名を使用してネイティブ メソッドを識別します。

ただし、これは、ネイティブ メソッドが JVM によって呼び出されたかロードされたか、共有ライブラリで定義されているかどうかを判断するものではありません。ネイティブ メソッドは、それが呼び出される場合にのみ定義する必要があり、その場合でもその不在はトラップ可能なエラーです。

于 2013-07-22T00:02:48.640 に答える