Учитывая файл класса, как обнаружить это использует JNI или нет?
У меня есть некоторые тесты Java только с файлами классов.
Я хотел бы узнать, какие тесты имеют вызовы JNI.
Я подумал, может быть, это можно сделать на уровне байт-кода с помощью javap -c
, но не уверен.
Есть идеи?
4 ответа
Спасибо за ответы на все вопросы.
Я нашел простой способ, как показано ниже:
java -verbose:jni -jar foo.jar
По сути, он выводит на консоль сообщение трассировки, показывающее методы JNI.
Вот подробности об этой опции от HotSpot: ref
Если вам разрешено загружать класс, вы можете использовать отражение:
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 или даже определен в общей библиотеке. Нативный метод нужно определять только в том случае, если он вызывается, и даже тогда его отсутствие является ошибкой, которую можно отследить.