JNI вопрос стартера - PullRequest
       35

JNI вопрос стартера

5 голосов
/ 10 февраля 2011


Я начал изучать JNI, и из того, что я понимаю, что, если проблема возникает с загруженным dll, jvm можно завершить на месте.
Т.е. процесс не может быть защищен, например, когдапоймать исключение.
Поэтому, если мое понимание верно, мой вопрос заключается в том, существует ли стандартный подход / шаблон для этой ситуации при использовании jni.
Или, если сформулировать это иначе, процессы, использующие jni, разработаны таким образом, чтобы избежатьэти проблемы?Или таких проблем не ожидается?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Да, JVM просто завершит работу, что является одной из причин, по которой код JNI действительно трудно отлаживать. Если вы используете код C ++, вы можете использовать исключения, а затем отобразить их в исключение Java, которое, по крайней мере, обеспечивает определенный уровень безопасности, но не помогает при таких вещах, как плохой доступ к памяти и т. Д.

С архитектурной точки зрения я предлагаю максимально отделить ваш код от JNI. Создайте структуру класса / процедуры, которая полностью тестируема из C ++ / C, и пусть код JNI выполняет только все преобразования. Если после этого произойдет сбой JVM, вы, по крайней мере, будете знать, где искать.

1 голос
/ 10 февраля 2011

Принципы ничем не отличаются от любого многопоточного приложения C:

  1. Всегда тщательно проверяйте все свои входные данные.
  2. Всегда освобождайте временную память, выделенную вами.
  3. Убедитесь, что ваши функции являются входящими.
  4. Не полагайтесь на неопределенное поведение.

Виртуальная машина Java не предлагает вам никакой дополнительной защиты для вашего собственного кода, если онапроисходит сбой или утечка, ваша виртуальная машина выйдет из строя или произойдет утечка.

0 голосов
/ 11 февраля 2011

Вы можете иметь точно такой же спектр обработки ошибок в библиотеке JNI, как и во всем остальном.

Вы можете использовать try / catch.Если вы работаете в Windows, вы можете использовать SEH.Если вы работаете в Linux, вы можете позвонить sigaction.

Тем не менее, если вы запутались и у вас есть SIGSEGV, ваша JVM, вероятно, поджидает, пытаетесь ли вы поймать этот сигнал или нет.

...