Вопрос

Я пару лет работал Java-разработчиком и слышал, что с помощью JNI можно делать довольно полезные и мощные вещи.Я не знаю, то ли мне просто не нужно было его использовать, то ли это не очень важно для меня;но мне вообще не приходилось его трогать.

Мне интересно, в чем польза этого аспекта Java.Примеры были бы отличными.

Это было полезно?

Решение

Это очень полезно.Я вижу две основные причины использовать JNI (вероятно, их больше).

  1. Производительность.Если у вас есть фрагмент кода, в котором среда выполнения Java по какой-либо причине не может снизить его производительность.Вы можете реализовать эту функцию в собственном коде и вызывать ее из Java.Это позволяет вам вручную настроить реализацию, если вы Действительно нужно.Однако это, вероятно, наименее распространенная причина: Java обычно работает нормально.

  2. Доступ к API-интерфейсам конкретной ОС.Это важная персона.У меня был случай, когда мне нужно было что-то сделать на Java, но при этом требовался доступ к чему-то, что Java просто не могла предоставить.В моем случае это были сокеты домена UNIX.Поскольку (как видно по названию) они специфичны для UNIX, стандартного способа их использования в Java не существует.Поэтому я создал класс, который действовал как обертку вокруг них в C, и получил к нему доступ через JNI.Виола, проблема решена.

Другие советы

Я написал расширенный уровень JNI для iSeries для доступа к DB2, пользовательским очередям, очередям данных и некоторым другим особенностям OS/400.Большая часть нашей системы на iSeries была бы невозможна без JNI.Так что да, у JNI есть свое место, и когда он вам понадобится, вы Действительно нужно это.

Это относительно сложно (по сравнению с чистой Java), но мощно и не ужасно.

Кроме того, всякий раз, когда я просматриваю какой-либо код JNI, я также рассматриваю возможность использования ЮНА.

Я могу придумать несколько вариантов использования:

  1. Интеграция с существующими API-интерфейсом низкого уровня (C/C ++), которые не имеют аналога Java
  2. Интеграция с аспектами системы, которая не подвержена доступным API -интерфейсам Java (прямой доступ к оборудованию и т. Д.)

Некоторые могут сказать, что это может быть полезно для создания высокооптимизированных разделов кода, однако с современными JVM вы становитесь довольно быстрыми, и сложности использования JNI, вероятно, перевесят любой выигрыш в производительности, который вы можете увидеть.

Есть несколько вариантов использования привязки к FFMPeg для C-декодирования (почти любого) видео/аудио формата.

Также есть JNA, благодаря которому создается впечатление, что вы используете саму библиотеку.Это «проще» с точки зрения того, что он передает все управление разработчику Java, и сложнее в том смысле, что вам нужно выяснить отображение структуры и проделать большую тяжелую работу, чтобы передать все указатели и т. д. правильно.

У нас было требование создать новый пользовательский интерфейс для устаревшего приложения C, работающего в Suse Linux.JNI был идеальным инструментом для работы.

В целом я считаю, что JNI противоречит идее Java «Напиши один раз, запускай где угодно».Однако есть случаи, когда JNI может быть полезен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top