Je ne parviens pas à faire fonctionner correctement le typemap SWIG (javapackage) . J’ai essayé de faire une version simple du problème, et même cela semble échouer.
foo.h:
#ifndef FOO_H #define FOO_H class Foo { public: Foo() {}; int doSomething() { return 1 }; }; #endif
bar.h:
#ifndef BAR_H #define BAR_H #include "foo.h" class Bar { public: Bar() {}; int doSomething(Foo foo) { return foo.doSomething(); }; }; #endif
Foo.i
%module FooMod %include "typemaps.i" %include "stdint.i" %{ #include "../header/foo.h" %} %include "../header/foo.h"
Bar.i
%module BarMod %import "Foo.i" %typemap("javapackage") Foo, Foo *, Foo & "com.me.t.foo"; %include "typemaps.i" %include "stdint.i" %{ #include "../header/bar.h" %} %include "../header/bar.h"
Courir ceux-ci avec ceci les commandes suivantes:
swig -c++ -java -package com.me.t.foo -outdir ../../src/com/me/t/foo -o ../src/Foo.cpp Foo.i swig -c++ -java -package com.me.t.bar -outdir ../../src/com/me/t/bar -o ../src/Bar.cpp Bar.i
Et je reçois cette sortie:
package com.me.t.bar; public class Bar { private long swigCPtr; protected boolean swigCMemOwn; protected Bar(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } protected static long getCPtr(Bar obj) { return (obj == null) ? 0 : obj.swigCPtr; } protected void finalize() { delete(); } public synchronized void delete() { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; BarModJNI.delete_Bar(swigCPtr); } swigCPtr = 0; } } public Bar() { this(BarModJNI.new_Bar(), true); } public int doSomething(Foo foo) { return BarModJNI.Bar_doSomething(swigCPtr, this, Foo.getCPtr(foo), foo); } }
BarModJNI.java:
package com.me.t.bar; public class BarModJNI { public final static native long new_Bar(); public final static native int Bar_doSomething(long jarg1, Bar jarg1_, long jarg2, Foo jarg2_); public final static native long Bar_getFoo(long jarg1, Bar jarg1_); public final static native void delete_Bar(long jarg1); }
Les fichiers sont générés correctement, mais notez qu’il n’ya pas d’instruction d’importation et que Foo ne peut donc pas être trouvé à partir de l’une des classes Java Bar. Ceci est un exemple simple, mais le simple codage en dur d’une instruction d’importation n’est pas une option pour moi, car les fichiers source générés contenant le code C JNI peuvent avoir des emplacements incorrects des fichiers de classe “Foo”.
Cela semble être un problème très simple et courant, donc, ce que je me demande, c’est si quelque chose me manque ou si je fais quelque chose de mal.
Merci pour l’aide!
Vous avez le même problème et vous avez trouvé la réponse, alors publiez-le pour la communauté.
Vous devez faire 3 changements.
Ajoutez des instructions d’importation à la classe proxy générée (Bar.java):
// Bar.i %pragma(java) jniclassimports=%{ import com.me.t.foo.Foo; %}
Ajoutez des instructions d’importation à la classe wrapper JNI générée (BarModJNI.java):
// Bar.i %typemap(javaimports) Bar %{ import com.me.t.foo.Foo; %}
Foo.getCPtr
à SWIG de faire de Foo.getCPtr
une variable membre publique car la classe Bar voudra y accéder:
// Foo.i SWIG_JAVABODY_PROXY(public, public, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
Référence:
Juste quelques commentaires sur la réponse fournie par Zbigniew. J’ai rencontré le même problème décrit dans ce post. Je voudrais clarifier deux points.
Tout d’abord, il me semble que l’étape 1 concerne l’ajout de l’importation dans la classe wrapper JNI (anyJNI.java), tandis que l’étape 2 concerne l’ajout d’importation à la classe spécifique.
Deuxièmement, l’étape 2 ne fonctionne pas pour moi, au lieu de %typemap(javaimports)
je devais utiliser %typemap(javaimports) SWIGTYPE
. La mauvaise chose est qu’il ajoute les importations à toutes les classes java générées et pas seulement à celle désirée.
Enfin, je rencontre toujours le problème suivant: SWIG ne reconnaît pas la classe imscope lors de l’emballage du type spécifique et utilise toujours SWIGTYPE_
au lieu de directement