Java: Как ошибки обычно обрабатываются для собственного кода в вызовах jni? - PullRequest
1 голос
/ 28 апреля 2009

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

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

На мой взгляд, у меня есть четыре очевидных варианта:

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

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

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

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

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

Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 апреля 2009

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

1 голос
/ 28 апреля 2009

Относительно методов, которые вы отметили:

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

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

...