#java #android #android-ndk #swig
Вопрос:
У меня есть проект для Android с библиотекой C . Классы JNI, созданные с помощью инструмента Swig.
Некоторые методы C вызывают исключения std, например std::invalid_argument
Для всех исключений std существует одно и то же исключение Java (например, C std::invalid_argument
= java.lang.IllegalArgumentException
). Но когда throw std::invalid_argument
в C происходит сбой приложения.
Как сказать SWIG, чтобы обернуть все сгенерированные методы в блок try-catch, чтобы использовать Java-исключения вместо исключений C ? Чтобы иметь возможность обрабатывать это исключение внутри моего java-кода.
Можно ли сделать это «в одной строке» или мне нужно явно создавать обертки для всех методов? Спасибо за помощь.
Мой глоток-сценарий: run_swig.sh
%module(directors="1") CppDsp
// Anything in the following section is added verbatim to the .cxx wrapper file
%{
#include "cpp-dsp.h"
#include "pipeline_options.h"
%}
//define converters from C double pointer to Kotlin double-array
%include carrays.i
%array_functions( double, double_array )
//define converters from C long pointer to Kotlin long-array
%array_functions( long long, long_long_array )
%array_functions( signed char, byte_array )
// Process our C file (only the public section)
%include "cpp-dsp.h"
%include "pipeline_options.h"
Комментарии:
1. См. директиву %exception .
Ответ №1:
Хорошо, проблема заключалась в том, что в swig-script.i
файле все #include
было после %exception
определения.
Рабочий пример:
%module(directors="1") CppDsp
// Anything in the following section is added verbatim to the .cxx wrapper file
%{
#include "cpp-dsp.h"
#include "pipeline_options.h"
%}
//define converters from C double pointer to Kotlin double-array
%include carrays.i
%array_functions( double, double_array )
//define converters from C long pointer to Kotlin long-array
%array_functions( long long, long_long_array )
%array_functions( signed char, byte_array )
%exception {
try {
$action
}
catch (const std::exceptionamp; e) {
SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, e.what());
return $null;
}
}
// Process our C file (only the public section)
// ENSURE, THAT INCLUDES ARE ON THE LAST LINES
%include "cpp-dsp.h"
%include "pipeline_options.h"