2010-08-11 5 views
0

Je suis en train de swigger vers Java. J'essaye d'obtenir une fonction membre modélisée pour utiliser un type de retour basé sur un modèle, que je dois donner un nom bien sûr (sinon SWIG ne créerait pas la source nécessaire).SWIG2 modèle de retour type espace de noms non détecté

test.i est comme:

%module Test 
%{ 

#include <vector> 

namespace ns 
{ 
    class C 
    { 
    public: 
    template <class T> 
    void doit(const std::vector<T>& v) {}; // will need std:vector<int> version of that 
    }; 
} 

%} 

%include "std_vector.i" 
%template(Ivec) std::vector<int>; // here I'm defining an std::vector<int> to use ... 

%nspace ns::C; 
namespace ns 
{ 
    class C 
    { 
    public: 
    template <class T> 
    void doit(const std::vector<T>& v); 
    }; 
} 
%extend ns::C 
{ 
    %template(Idoit) doit<int>; // ... here 
} 

Lorsque vous appelez:

swig -c++ -java -outdir mypack -package mypack test.i 

mypack/ns/C.java ressemble:

package mypack.ns; 

public class C { 
    private long swigCPtr; 
    protected boolean swigCMemOwn; 

    public C(long cPtr, boolean cMemoryOwn) { 
    swigCMemOwn = cMemoryOwn; 
    swigCPtr = cPtr; 
    } 

    public static long getCPtr(C obj) { 
    return (obj == null) ? 0 : obj.swigCPtr; 
    } 

    protected void finalize() { 
    delete(); 
    } 

    public synchronized void delete() { 
    if (swigCPtr != 0) { 
     if (swigCMemOwn) { 
     swigCMemOwn = false; 
     mypack.TestJNI.delete_ns_C(swigCPtr); 
     } 
     swigCPtr = 0; 
    } 
    } 

    public void Idoit(Ivec v) { // OK, Ivec is beeing used ... but not with its fqn 
    mypack.TestJNI.ns_C_Idoit(swigCPtr, this, Ivec.getCPtr(v), v); 
    } 

    public C() { 
    this(mypack.TestJNI.new_ns_C(), true); 
    } 

} 

ce qui est bien, mais Ivec est défini dans mypack/Ivec.java, c'est-à-dire dans le paquet 'global' et donc la compilation échoue. Comment puis-je faire en sorte que SWIG utilise le nom complet d'Ivec?

J'ai aussi essayé de pousser Ivec dans le même espace que C comme:

%module Test 
%{ 

#include <vector> 

namespace ns 
{ 
    class C 
    { 
    public: 
    template <class T> 
    void doit(const std::vector<T>& v) {}; // will need std:vector<int> version of that 
    }; 
} 

%} 

%include "std_vector.i" 
%nspace ns::C; 
%nspace ns::Ivec; 
namespace ns 
{ 
    %template("ns.Ivec") std::vector<int>; 
    class C 
    { 
    public: 
    template <class T> 
    void doit(const std::vector<T>& v); 
    }; 
} 
%extend ns::C 
{ 
    %template(Idoit) doit<int>; 
} 

mais qui a pour effet que Ivec est toujours situé dans mypack et mypack/ns/C.java est maintenant:

package mypack.ns; 

public class C { 
    private long swigCPtr; 
    protected boolean swigCMemOwn; 

    public C(long cPtr, boolean cMemoryOwn) { 
    swigCMemOwn = cMemoryOwn; 
    swigCPtr = cPtr; 
    } 

    public static long getCPtr(C obj) { 
    return (obj == null) ? 0 : obj.swigCPtr; 
    } 

    protected void finalize() { 
    delete(); 
    } 

    public synchronized void delete() { 
    if (swigCPtr != 0) { 
     if (swigCMemOwn) { 
     swigCMemOwn = false; 
     mypack.TestJNI.delete_ns_C(swigCPtr); 
     } 
     swigCPtr = 0; 
    } 
    } 

    public void Idoit(SWIGTYPE_p_ns__std__vectorT_int_t v) { // aaaaaaaaah 
    mypack.TestJNI.ns_C_Idoit(swigCPtr, this, SWIGTYPE_p_ns__std__vectorT_int_t.getCPtr(v)); 
    } 

    public C() { 
    this(mypack.TestJNI.new_ns_C(), true); 
    } 

} 

et maintenant SWIG ne reconnaît pas même la fraîcheur Ivec :(

Quelqu'un at-il éprouvé des difficultés semblables et me donner quelques indices?

B I G T H X bbb

Répondre

0

Maintenant, je fixe la première version en ajoutant

%typemap(javaimports) ns::C " 
import mypack.Ivec; 
" 

droit ...

[ ... ] 
%nspace ns::C; 
// ... here 
namespace ns 
{ 
[ ... ] 

Maintenant, le nom sera résolu par le compilateur java.

Cheers.