我有一些只有类文件的Java基准测试。
我想找出哪些基准测试具有JNI调用。
我想也许这可以在javap -c
的帮助下从字节码级别完成,但不确定。
有什么想法吗?
如果允许加载类,则可以使用反射:
Class<?> clazz = ...
List<Method> nativeMethods = new ArrayList<>();
for (Method m : clazz.getDelcaredMethods()) {
if(Modifier.isNative(m.getModifiers())) {
nativeMethods.add(m);
}
}
从最初的问题中还不清楚您是否想以编程方式找到本机(JNI)方法。使用javap,您可以使用以下内容:
javap -private java.awt.image.BufferedImage | grep native
这与您所描述的思路一致:
javah [options] <classes> -d <dir>
grep -r "JNIEXPORT" <dir>
每一行输出都将使用其JNI导出名称标识一个本机方法。
但是,这并不能确定JVM是否调用或加载了本机方法,甚至不能确定是否在共享库中定义了本机。只有当调用了本机方法时才需要定义它,即使这样,它的缺失也是一个可捕获的错误。
感谢您的回答。
我找到了一个简单的方法如下:
java -verbose:jni -jar foo.jar
基本上,它向控制台打印一条跟踪消息,显示JNI方法。
以下是HotSpot中有关此选项的详细信息:ref