Учитывая файл класса, как обнаружить это использует 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 или даже определен в общей библиотеке. Нативный метод нужно определять только в том случае, если он вызывается, и даже тогда его отсутствие является ошибкой, которую можно отследить.

Другие вопросы по тегам