给定一个类文件,如何检测它是否使用JNI?

时间:2013-07-21 20:21:09

标签: java java-native-interface bytecode .class-file javap

我有一些只有类文件的Java基准测试。

我想找到哪些基准测试有JNI调用。

我想也许这可以在javap -c的帮助下从字节码级别完成,但不确定。

有什么想法吗?

4 个答案:

答案 0 :(得分:7)

如果允许加载该类,则可以使用反射:

Class<?> clazz = ...
List<Method> nativeMethods = new ArrayList<>();
for (Method m : clazz.getDelcaredMethods()) {
    if(Modifier.isNative(m.getModifiers())) {
        nativeMethods.add(m);
    }
}

答案 1 :(得分:2)

目前还不清楚原始问题是否要以编程方式查找本机(JNI)方法。使用javap,您可以使用以下内容:

javap -private java.awt.image.BufferedImage | grep native

答案 2 :(得分:0)

这与你所描述的一致:

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

每行输出将使用其JNI导出名称标识本机方法。

但是,这并不能确定JVM是调用或加载本机方法,还是在共享库中定义。只有在调用它时才需要定义本机方法,即使它的缺失是一个可捕获的错误。

答案 3 :(得分:0)

感谢所有答案。

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

java -verbose:jni -jar foo.jar

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

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