Я немного поработал с Google, и действительно не нашел хорошего ответа на мой вопрос: как обычно передать информацию об ошибках в java из нативного кода jni?
Обычно я просто выбираю дизайн и работаю с ним, но этот код вызывается каждые 5 миллисекунд (приблизительно), поэтому я подумал, что спросить, есть ли обычный «чистый / эффективный» способ сделать это.
На мой взгляд, у меня есть четыре очевидных варианта:
При каждом вызове в java создайте объект «возврат ошибки» и передайте его в JNI. Если есть проблема, нативный код заполняет описание ошибки в этом объекте, а java-код проверяет его при возврате. Так как ошибки не являются распространенным случаем, это создает много объектов для очистки GC, и 99,99% из них не нужны.
Подобно # 1, создайте некоторый одиночный объект «возврат ошибки» в классе java, который передается каждому вызову метода снова и снова. Проверьте это в коде Java на каждом возврате на наличие ошибок. Мне это кажется странным, но, может быть, это правильный вариант?
Создайте объект в собственном коде, который содержит описание ошибки, если применимо, и передайте его обратно в качестве возвращаемого значения в Java. После звонка в java проверьте возврат на ноль. Это кажется менее расточительным, чем № 1, но это немного неловко.
Просто создайте целочисленное возвращаемое значение в методе jni и передайте обратно значение int, соответствующее значению "exit" собственного кода. Перечислите все возможные собственные состояния выхода в карте Java. Сравните возвращаемое значение с '0' и найдите ошибку на этой карте, если это необходимо. Это кажется более эффективным, чем другие, но кажется более неуклюжим, так как изменение в собственном коде потребовало бы, чтобы кто-то вернулся и обновил «таблицу ошибок».
Мне кажется, что я упускаю что-то очевидное ... есть ли гуру, который может предложить какое-то понимание?
Спасибо!