Java: как обычно обрабатываются ошибки для собственного кода в вызовах jni?

Я немного погуглил и не нашел хорошего ответа на свой вопрос: каков обычный способ передачи информации об ошибках в java из собственного кода jni?

Обычно я просто выбираю дизайн и использую его, но этот код вызывается каждые 5 миллисекунд (приблизительно), поэтому я подумал, что стоит спросить, есть ли обычный «чистый/эффективный» способ сделать это.

Как я это вижу, у меня есть четыре очевидных варианта:

  1. При каждом вызове в java создайте объект "возврат ошибки" и передайте его в JNI. Если есть проблема, собственный код заполняет описание ошибки в этом объекте, а код Java проверяет его по возвращении. Поскольку ошибки не являются частым случаем, сборщик мусора создает много объектов, которые необходимо очистить, и 99,99% из них не нужны.

  2. Подобно #1, создайте некоторый одиночный объект "возврата ошибки" в классе java, который передается при каждом вызове метода снова и снова. Проверяйте его в коде Java при каждом возврате на наличие ошибок. Мне это кажется изворотливым, но, может быть, это правильный вариант?

  3. Создайте объект в собственном коде, который содержит описание ошибки, если применимо, и передайте его обратно в качестве возвращаемого значения в java. После вызова в java проверьте возврат на null. Это кажется менее расточительным, чем № 1, но кажется немного неудобным.

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

Я чувствую, что упускаю что-то очевидное... есть ли гуру, который может дать какое-то понимание?

Спасибо!


person Decker    schedule 28.04.2009    source источник


Ответы (2)


Генерировать исключения Java: http://java.sun.com/docs/books/jni/html/exceptions.html?

person ewanm89    schedule 28.04.2009
comment
Ага. Вам нужна конкретная функция ThrowNew (java.sun.com/javase/6/docs/technotes/guides/jni/spec/) - person Matthew Flaschen; 28.04.2009
comment
Как описано в ссылке, которую я разместил, нужно сказать ей, чтобы сначала найти класс исключений. - person ewanm89; 28.04.2009
comment
Истинный. Кроме того, если вы хотите сгенерировать объект исключения с помощью конструктора, отличного от строки с одним аргументом, вы просто создаете его вручную и используете Throw. - person Matthew Flaschen; 28.04.2009
comment
Большое спасибо, я был в этом коде C уже 3 месяца, и я думаю, что это исказило мой мозг - я все еще думал в режиме C. Мне не приходило в голову, что я могу выбрасывать исключения из C в java, так что я все-таки что-то упустил. Спасибо еще раз. - person Decker; 28.04.2009

Что касается методов, которые вы отметили:

  1. Как вы упомянули, это генерирует много вызовов выделения/освобождения, которые.
  2. Этот метод не будет работать, если у вас есть более 1 потока, вызывающего ваш собственный код.
  3. Это предполагает, что вам не нужно возвращаемое значение для чего-либо еще. Также возникает вопрос, где и когда ваш объект ошибки «освобождается».
  4. Предполагая, что вы не используете возвращаемое значение ни для чего другого и что вам не нужна никакая «дополнительная» информация об ошибке, это хорошее решение. Возможные ошибки не должны меняться достаточно часто, иначе возникнут проблемы при обновлении кода Java.

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

person Tal Pressman    schedule 28.04.2009
comment
Я думал, что технически в java принято выбрасывать исключение, а не использовать возвращаемое значение? - person ewanm89; 28.04.2009
comment
Это на Java, но как только вы вызываете собственный код, это зависит от того, что именно вы вызываете. - person Tal Pressman; 28.04.2009
comment
Да, в этом нативном коде шаблон таков, что каждый метод возвращает значение успеха или неудачи, а выходные данные заполняются переданными ссылками/указателями. Итак, я все еще думал в этом режиме о своем решении. Спасибо за ответы! - person Decker; 28.04.2009