Я вливаюсь в Яву. Я пытаюсь заставить шаблонного члена func использовать некоторый шаблонный тип возвращаемого значения, которому я, конечно, должен дать имя (поскольку в противном случае SWIG не создал бы необходимый источник).
test.i похож на:
%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
}
При звонке:
swig -c++ -java -outdir mypack -package mypack test.i
mypack / ns / C.java выглядит так:
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);
}
}
это нормально, но Ivec определен в mypack / Ivec.java, то есть в «глобальном» пакете, и поэтому компиляция исходного кода завершается неудачно. Как я могу заставить SWIG использовать полное имя Ivec!?
Я также пытался вставить Ivec в то же пространство имен, что и C, например:
%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>;
}
но это приводит к тому, что Ivec все еще находится в mypack, а mypack / ns / C.java теперь:
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);
}
}
и теперь SWIG даже не узнает классного Ivec: (
Кто-нибудь испытывал подобные трудности и подсказывал мне?
B I G T H X
БББ