Использование собственного компонента в Java [дубликат]

7
задан Ciro Santilli 新疆改造中心法轮功六四事件 4 June 2015 в 05:55
поделиться

6 ответов

По моему опыту, недостатки использования библиотек машинного кода значительны:

  • JNI / JNA имеют тенденцию дестабилизировать JVM, особенно если вы пытаетесь сделать что-то сложное. Если ваш собственный код неправильно управляет памятью собственного кода, есть шанс, что вы вылетите из JVM. Если ваш собственный код не реентерабелен и вызывается более чем из одного потока Java, будут происходить плохие вещи ... время от времени. И так далее.

  • Java с собственным кодом труднее отлаживать, чем чистую Java или чистый C / C ++.

  • Собственный код может вызвать значительные зависимости / проблемы от платформы для приложения Java, независимого от платформы.

  • Для нативного кода требуется отдельная платформа сборки, что также может иметь проблемы с платформой / переносимостью.

Вообще говоря, вы не получите много (если вообще есть) дополнительной производительности, используя собственный код. Хотя вы можете подумать, что ваш C / C ++ будет более производительным, чем Java, JIT-компилятор в наши дни неплохо справляется с оптимизацией, и вы должны учитывать затраты на производительность при выполнении вызовов JNI и других взаимодействий через границу JNI.

Как правило, вы должны рассматривать JNI / JNA как «последнее средство». Если есть какой-либо другой способ решения проблемы, вероятно, он лучше.

2
ответ дан 6 December 2019 в 11:46
поделиться

Как веб-разработчик, вы с большей вероятностью встретите родной , если используете Google Web Toolkit. С помощью этой структуры вы, по сути, пишете код Java, который затем компилируется в Javascript, который можно запускать в браузере. В GWT ключевое слово native используется для вызова «собственного» кода Javascript.

Ищите термин JSNI.

1
ответ дан 6 December 2019 в 11:46
поделиться

Вот некоторые цитаты из Эффективная Java 2-я редакция, Правило 54: Разумно используйте собственные методы :

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

Использование собственных методов для доступа к средствам, зависящим от платформы, является правомерным, но по мере развития платформы Java она предоставляет все больше и больше возможностей, которые ранее были доступны только на хост-платформах. [...] Редко рекомендуется использовать собственные методы для повышения производительности [...]

Использование собственных методов имеет серьезные недостатки. Поскольку родные языки небезопасны , приложения, использующие собственные методы, больше не защищены от ошибок повреждения памяти. Поскольку родные языки зависят от платформы, приложения, использующие собственные методы, гораздо менее переносимы. Приложения, использующие собственный код, сложно отлаживать. Существует фиксированная стоимость, связанная с входом в собственный код и выходом из него, поэтому собственные методы могут снизить производительность, если они выполняют лишь небольшой объем работы. Наконец, нативные методы требуют «связующего кода», который трудно читать и утомительно писать.

Во всем документе есть более подробные объяснения по вопросам. Настоятельно рекомендуется, как и вся книга.

См. Также

0
ответ дан 6 December 2019 в 11:46
поделиться
  1. У вас может быть не Java библиотека, которую по каким-либо причинам вы должны использовать в вашем Java проекте
  2. Вам может понадобиться интегрировать старое или редко используемое оборудование и нужно реализовать интерфейс, который может быть намного проще на C/C++

Если вы хотите решить проблему производительности с помощью нативного кода, то с вероятностью 99.5% это неправильный подход ;-)

6
ответ дан 6 December 2019 в 11:46
поделиться

Java является платформо-независимой, что означает, что программы, написанные на Java, могут работать на любой операционной системе - вам даже не нужно перекомпилировать, скомпилированные файлы классов должны работать на любой операционной системе.

Иногда, однако, вам нужно сделать что-то в вашей программе, что очень специфично для определенной операционной системы, и может не быть чистого Java способа сделать то, что вам нужно; или вам может понадобиться вызвать существующую не Java библиотеку. Платформа Java предоставляет JNI (Java Native Interface) как способ вызова кода, специфичного для операционной системы.

Однако использовать нативный код следует осторожно, поскольку он привязывает вашу программу к конкретной операционной системе.

0
ответ дан 6 December 2019 в 11:46
поделиться
  • производительность
  • более тесная интеграция с родным окружением
  • необходимость использования родной библиотеки с уникальными возможностями

примеры: JAI (обработка изображений), Java 3D (OpenGL), JDIC (интеграция с рабочим столом)

1
ответ дан 6 December 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: