2016-04-05 20 views
2

Ich habe erfolgreich die folgende typemap in einer swig Interface-Datei, in der Zielsprache Python ist:Mit SWIG typemaps mit java

%typemap(argout) track_t **phash_tracks { 
    %append_output(SWIG_NewPointerObj(%as_voidptr(*$1), $*1_descriptor, SWIG_POINTER_OWN)); 
} 

%typemap(in) track_t **phash_tracks (track_t *tracks) { 
    // Alternatively, check if $input is a 0 integer `PyObject`... 
    if ((SWIG_ConvertPtr($input, (void **) &tracks, $*1_descriptor, SWIG_POINTER_DISOWN)) == -1) 
    tracks = NULL; 
    $1 = &tracks; 
} 

Allerdings, wenn ich die Zielsprache Java ändern, ich habe eine Menge Kompilierung bekommen Zeitfehler, wenn ich die automatisch generierte c-Wrapper-Code versuchen und bauen, die swig produziert, dh

warning: implicit 
     declaration of function 'SWIG_ConvertPtr' is invalid in C99 [-Wimplicit-function-declaration] 
    if ((SWIG_ConvertPtr(jarg1, (void **) &tracks1, SWIGTYPE_p_track_t, SWIG_POINTER_DISOWN)) == -1) 

error: use of undeclared 
     identifier 'SWIG_POINTER_DISOWN' 
    if ((SWIG_ConvertPtr(jarg1, (void **) &tracks1, SWIGTYPE_p_track_t, SWIG_POINTER_DISOWN)) == -1) 

error: expected expression 
    %append_output(SWIG_NewPointerObj(%as_voidptr(*arg1), SWIGTYPE_p_track_t, SWIG_POINTER_OWN)); 

und so weiter ...

ich stellte fest, dass der Code, der in geklebt wird die die swig Wrappercode im Python Fall, dass die Erklärungen der SWIG_ConvertPtr, SWIG_POINTER_DISOWN usw. enthält, stammt aus swigrun.swg

dies in /usr/share/swig2.0/

Diese äquivalente Code eingefügt wird nicht in den swig Wrappercode wenn die Zielsprache befindet ist Java. Ich bin mir nicht ganz sicher, warum das nicht passiert, denn ohne es kann es nicht kompilieren wegen all der fehlenden Deklarationen, die die Typemaps brauchen.

Ist etwas kaputt mit meinem SWIG-Setup oder leide ich an einem grundlegenden Missverständnis, etwas wie Sie können keine typemaps mit Java oder etwas ähnliches verwenden?

Ich bemerkte auch in der c-Wrapper-Code für Java, dass die %append als in der Schnittstellendatei wörtlich in der automatisch generierten .c-Datei erschien, d.h. Swig hatte es für nichts ersetzt. Dies führte auch zu einem der vielen Kompilierzeitfehler.

Antwort

1

Das Typsystem von Python unterscheidet sich sehr von Java, daher ist auch die SWIG-Laufzeit unterschiedlich.

Vom manual:

Java ist eine der wenigen nicht-Skriptsprache Module in SWIG. Da SWIG die Typensicherheit verwendet, die die Java-Sprache bietet, erfordert sie einen etwas anderen Ansatz als für Skriptsprachen. Insbesondere werden die Laufzeittypüberprüfung und die Laufzeitbibliothek von Java nicht verwendet.

Sie können immer noch typemaps für Java schreiben, aber wegen der starken Typisierung sie eher anders sein am Ende braucht und Funktionen wie SWIG_ConvertPtr einfach nicht existieren, da sie nicht benötigt werden.

Wenn Sie sie schreiben, können richtige Typmaps sprachunabhängig sein, aber sobald Sie anfangen, benutzerdefinierte Typemaps zu schreiben, anstatt sich auf diejenigen außerhalb der SWIG-Bibliothek zu verlassen, hört es schnell auf, generisch zu sein. Es gibt einen Kompromiss zwischen generischen Schnittstellen mit SWIG und Schnittstellen, die sich auch für Benutzer der Zielsprache "richtig" anfühlen.

+0

so meine Annahme, dass eine .i-Datei Zielsprache Agnostiker ist falsch. Ich dachte, das könnte der Fall sein. Ich muss zurück zu den Dokumenten, ich versuche das gleiche für Java zu erreichen, wie ich es für Python getan habe -> http://stackoverflow.com/questions/36184402/how-to-apply-a- swig-typeMap-für-ein-Doppelzeiger-struct-Argument. I.e. Handle ein Doppelzeigerargument mit einem Typmap – bph

+1

@bph meine Antworten auf http://Stackoverflow.com/a/11967859/168175 und http://Stackoverflow.com/a/12767656/168175 sind ähnliche Beispiele in Java, die ich denke, könnte helfen Sie. – Flexo