JNA ловить исключения - PullRequest
       5

JNA ловить исключения

8 голосов
/ 29 августа 2011

У меня быстрый вопрос о том, что делать с исключениями, создаваемыми библиотеками в JNA ...

Когда я выкидываю исключение в исходный нативный код, JNA получает недопустимую ошибку доступа к памяти. Я предполагаю, что это потому, что библиотеки C не могут выбросить исключение через свой стек (на самом деле это C ++ / CLR, но имеет экспорт C)? Так нет ли реального способа сообщить об исключении в Java? Или "это должно сработать", и я просто делаю что-то невероятно неправильно?

DllExport void Initialize(char* dir)
{
    throw gcnew System::Exception("Testing");
}

Было бы неплохо для Java иметь возможность обнаруживать эти сгенерированные исключения, и я думаю, что я мог бы на самом деле изучить передачу указателя памяти во все мои экспорты C и проверить, являются ли они нулевыми или нет, но похоже окольным путем.

Ответы [ 2 ]

6 голосов
/ 29 августа 2011

C ++ исключения могут быть обработаны только в коде C ++.Им никогда не должно быть позволено покинуть мир C ++ (т. Е. Интерфейс C кода C ++ никогда не должен позволять распространяться исключениям).Даже небезопасно позволять исключению C ++ распространяться через слой кода C между двумя модулями C ++ (например, когда функция C ++ вызывает функцию C, которая в свою очередь вызывает функцию C ++).

Один изПричиной этого является то, что не существует стандарта того, как должны реализовываться исключения C ++, поэтому модули C ++ совместимы только в двоичном формате, если они скомпилированы одним и тем же компилятором (в той же версии).Таким образом, код на любом другом языке не может быть настроен для обработки исключений C ++.

В этом случае (библиотека C ++, интерфейс C, вызванный из Java) вам придется перехватывать исключение C ++, распространять информацию черезинтерфейс C (например, используя коды возврата ошибок), проверьте его в Java и сгенерируйте там исключение.

5 голосов
/ 29 августа 2011

Вам нужно самостоятельно обработать исключение c ++ и вместо этого создать исключение java, которое можно передать на сторону кода java.

...