Я создал файл интерфейса 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?
У меня есть много классов, которые включают такие аргументы в функцию.
Есть ли способ, чтобы я мог применить решение для массовых файлов для дескриптора типа данных как можно проще.
Я прочитал один способ сделать это, создать вспомогательную функцию, но я не могу пойти на это, потому что у меня есть много классов C ++, и для каждой функции создание вспомогательной функции для возврата указателя не путь.
Пожалуйста, предложите любой другой способ, если это возможно.
Решил сам. Swig не смог распознать все typedef в заголовочных файлах и, следовательно, он создавал такие типы в оболочке. Мне нужно переопределить их в файле интерфейса.
О булевых, я бы порекомендовал использовать bool
вместо BOOL
потому что JNI напрямую предоставляет для него сигнатуру типа: Z
(вы можете проверить подписи по адресу: Типы JNI и структуры данных)
Что касается указателей, если указатель на базовые типы, это объявляется путем добавления [
перед соответствующей подписью это: int* --> [I
, Если это указатель на собственный класс, swig создаст полностью определенный класс.
Надеюсь это поможет.
Это из-за странного объявления BOOL
тип.
В этом конкретном случае вы можете передать int
там со стороны Java. Или 0
или же 1
будет делать правильную работу.
Или вы можете изменить BOOL
в bool
в вашем родном коде, создав небольшую оболочку для этой библиотеки.
SWIG не знает о типах окон. добавлять %include <windows.i>
к определению интерфейса.