Проблема SWIG (от C++ до Java) с включением одних и тех же заголовков из разных модулейJAVA

Программисты JAVA общаются здесь
Anonymous
Проблема SWIG (от C++ до Java) с включением одних и тех же заголовков из разных модулей

Сообщение Anonymous »

Я получил пример заголовка Shape.h с двумя перечислениями, например:

Код: Выделить всё

enum ShapeType {
ShapeTypeRect,
ShapeTypeCirle,
ShapeTypeDefault,
};

enum ShapeStyle {
ShapeStyleSolid,
ShapeStyleDashed,
ShapeStyleDefault,
};
И класс, который использует эти перечисления:

Код: Выделить всё

class A {
ShapeType getShapeTyoe() const;
ShapeStyle getShapeStyle() const;
};
Я не буду создавать отдельные модули для создания оболочек для перечислений:
Сначала:

Код: Выделить всё

%inline %{
#include 
%}

%rename("Solid") ShapeStyleSolid;
%rename("Dashed") ShapeStyleDashed;
%rename("Default") ShapeStyleDefault;

%include 
секунда:

Код: Выделить всё

%inline %{
#include 
%}

%rename("Rect") ShapeTypeRect;
%rename("Circle") ShapeTypeCircle;
%rename("Default") ShapeTypeRect;

%include 
И в конце модуль для оболочки класса A
который импортирует модули с помощью перечисления:

Код: Выделить всё

%import "Module_ShapeType.i"
%import "Module_ShapeStyle.i"

%inline %{
#include 
%}

%include 
Проблема в том, что я создал классы Java для перечислений ShapeType и ShapeStyle, но методы Java класса A выглядят так:
р>

Код: Выделить всё

public ShapeType getShapeTyoe()
public SWIGTYPE_ShapeStyle getShapeStyle()
несмотря на импорт, который я добавил.
Если я изменю порядок импорта:

Код: Выделить всё

%import "Module_ShapeStyle.i"
%import "Module_ShapeType.i"
Методы класса A выглядят следующим образом:

Код: Выделить всё

public SWIG_TYPE_ShapeType getShapeType()
public ShapeStyle getShapeStyle()
Если я перенесу второе перечисление в отдельные файлы, все будет работать нормально, но проблема в том, что у меня много мест в коде со множеством перечислений в одном заголовке, и оно должно оставаться таким.
Есть ли способ это исправить?
Я тоже пробовал использовать один модуль для перечислений, но с переименованием возникла другая проблема:
р>

Код: Выделить всё

%rename("Rect") ShapeTypeRect;
%rename("Circle") ShapeTypeCircle;
%rename("Default") ShapeTypeRect;

%rename("Solid") ShapeStyleSolid;
%rename("Dashed") ShapeStyleDashed;
%rename("Default") ShapeStyleDefault;
Я не могу использовать переименование с тем же значением, что и Default, в одном модуле, поскольку сгенерированный класс Java для одного из перечислений не содержит поля Default.
p>
Я хотел бы использовать перечисление из Java/Kotlin, например ShapeStyle.Default ShapeType.Default вместо ShapeStyle.ShapeStyleDefault и ShapeType. ShapeTypeDefault таким образом я тоже хочу использовать эти переименования.
Можно ли добиться того, что я описал, используя отдельные модули, но я сделал что-то не так?
Или можно Я использую какой-то трюк с переименованием с использованием одного модуля?

Подробнее здесь: https://stackoverflow.com/questions/787 ... nt-modules

Вернуться в «JAVA»