Оберните все методы, созданные swig, в try { } catch

#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"