Ich habe ein Problem beim Einwickeln eines großen C++ - Code mit JAVA SWIG.SWIG JAVA, wie C++ mehrere Vererbung mit% Interface und rein virtuellen Methoden Wrap
Was ich versuche, ist Wrapped eine abgeleitete Klasse, die 2 andere Klassen in C++ erweitert, aber eine der Klassen (Base1 im Beispiel unten), sollte als eine Schnittstelle umgebrochen werden. (Um zu berücksichtigen, dass Java keine Mehrfachvererbung hat).
Ich habe das Problem gefunden und erstellt eine einfache C++ Code, der das Problem veranschaulichen:
namespace Space {
class Base1 {
public:
virtual void Method1() = 0;
};
class Base2 {
public:
virtual void Method2();
};
class Derived : public Base1, public Base2 {
public:
virtual void Method1();
};
}
Der obige Code stellt dar, was ich in JAVA wickeln möchten.
Als ich Swig laufen auf dem obigen Beispiel, es Base1 als Schnittstelle erzeugt (wie es sein sollte)
public interface Base1 {
long Base1_GetInterfaceCPtr();
void Method1();
}
und erklärt (in JAVA) die abgeleitete Klasse Base2 erstreckt und Base1 Umsetzung (wie es sollte auch), ABER, ist es nicht eine Java-Methode in der abgeleiteten Klasse, die die Schnittstelle Base1 (Method1 innerhalb Abgeleitet) die vollständige abgeleitete Java-Klasse generiert implementiert ist wie folgt:
public class Derived extends Base2 implements Base1 {
private transient long swigCPtr;
protected Derived(long cPtr, boolean cMemoryOwn) {
super(SOURCEIJNI.Derived_SWIGUpcast(cPtr), cMemoryOwn);
swigCPtr = cPtr;
}
protected static long getCPtr(Derived obj) {
return (obj == null) ? 0 : obj.swigCPtr;
}
protected void finalize() {
delete();
}
public synchronized void delete() {
if (swigCPtr != 0) {
if (swigCMemOwn) {
swigCMemOwn = false;
SOURCEIJNI.delete_Derived(swigCPtr);
}
swigCPtr = 0;
}
super.delete();
}
public long Base1_GetInterfaceCPtr() {
return SOURCEIJNI.Derived_Base1_GetInterfaceCPtr(swigCPtr);
}
public Derived() {
this(SOURCEIJNI.new_Derived(), true);
}
}
Und so, im stecken mit ein Java-Kompilierungsfehler einer SWIG-generierten Klasse (Derived), die nicht alle Methoden ihrer Schnittstelle (Base1) implementiert
Was fehlt mir? Ich habe die Dokumentation zu lesen und sollte funktionieren ...
Meine ".i" file: (mit swig 3.0.10)
%module SOURCEI
%include <swiginterface.i>
%interface_impl(Space::Base1);
%{
#include "Source.h"
%}
%include "Source.h"
folgt Wenn ich die „= 0“ für reine entfernen virtuell und entfernen Sie die Deklaration von method1 in Derived, es funktioniert. Aber für mein Projekt kann ich die ".h" s nicht ändern. 'Namespace Space { Klasse Base1 { public: virtuelles void Method1(); }; Klasse Base2 { public: virtuelle void Method2(); }; Klasse Abgeleitet: öffentlich Base1, öffentlich Base2 { }; } ' –