Функция С++ с указателем в качестве параметра и обрабатывает ее с помощью интерфейса swig

Я создал файл интерфейса swig для создания JNI для моих файлов C++. но некоторые из моих файлов C++ включают функции, которые принимают указатель в качестве аргумента, например (void*), C++ BOOL, и Swig преобразует его в тип, например SWIGTYPE_p_int32_t, как передать такой тип данных из java?

например, один из фактических прототипов функций, как показано ниже в C++

DLL_API void DLL_CALLCONV FreeImage_Initialise(BOOL load_local_plugins_only FI_DEFAULT(FALSE));

который преобразуется в файл Java с помощью swig

public static void FreeImage_Initialise(SWIGTYPE_p_int32_t load_local_plugins_only)

как передать такое значение из java?

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

Я прочитал один из способов сделать это, создав вспомогательную функцию, но я не могу пойти на это, потому что у меня много классов С++, и для каждой функции создание вспомогательной функции для возврата указателя не подходит.

Предложите любой другой способ, если это возможно.


person Kirtan    schedule 14.11.2013    source источник


Ответы (4)


Решил сам. Swig не мог распознать все определения типов в файлах заголовков и, следовательно, создавал такие типы в оболочке. Мне нужно переопределить их в файле интерфейса.

person Kirtan    schedule 14.11.2013
comment
SWIG по умолчанию не рекурсивно обращается к определениям #include, и обычно вы этого не хотите. См. мой ответ, чтобы сообщить SWIG о типах Windows, таких как BOOL. - person Mark Tolonen; 16.11.2013

Что касается логических значений, я бы рекомендовал использовать boolвместо BOOL, потому что JNI напрямую предоставляет для него сигнатуру типа: Z (вы можете проверить сигнатуры по адресу: Типы и структуры данных JNI)

Что касается указателей, если они являются указателями на базовые типы, это объявляется добавлением [ перед соответствующей подписью, это: int* --> [I. Если это указатель на собственный класс, swig создаст полностью определенный класс.

Надеюсь это поможет.

person jcm    schedule 14.11.2013

Это из-за странного объявления типа BOOL.

В этом конкретном случае вы можете передать int со стороны Java. Либо 0, либо 1 сделают правильную работу.

Или вы можете изменить BOOL на bool в своем собственном коде, создав небольшую оболочку для этой библиотеки.

person Sergey K.    schedule 14.11.2013
comment
Я не могу использовать 0,1 со стороны java вместо SWIGTYPE_p_int32_t. и как насчет случая, когда функция возвращает указатели типа SWIGTYPE_p_int32_t и void*? - person Kirtan; 14.11.2013
comment
Но вы можете пропатчить этот тип до простого int. Если ваши функции возвращают void*, вы мало что можете с этим сделать в Java. Однако вы можете сохранить его в int и передать обратно в собственный код, где он принимает void*. - person Sergey K.; 14.11.2013
comment
Я могу исправить его для одной функции, сэр, но я пытаюсь создать оболочку сторонней библиотеки, которая включает этот тип во многих местах кода, а не только в одной функции. - person Kirtan; 14.11.2013
comment
Вы можете #define SWIGTYPE_p_int32_t int - person Sergey K.; 14.11.2013

SWIG не знает о типах окон. Добавьте %include <windows.i> к определению интерфейса.

person Mark Tolonen    schedule 15.11.2013