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 回答
0

感谢所有的答案。

我找到了一个简单的方法如下:

java -verbose:jni -jar foo.jar

基本上,它会向控制台打印一条显示 JNI 方法的跟踪消息。

以下是 HotSpot 中有关此选项的详细信息:参考

于 2013-07-28T23:25:15.590 回答