2010-03-31 4 views
0

Mon code a une interface commemanipulation refrence aux pointeurs/doubles pointeurs en utilisant SWIG [C++ Java]

class IExample { ~IExample(); //pure virtual methods ...};

une classe héritant de l'interface comme

class CExample : public IExample { protected: CExample(); //implementation of pure virtual methods ... };

et global fonction pour créer l'objet de cette classe -

createExample(IExample *& obj) { obj = new CExample(); } ;

Maintenant, je suis en train d'obtenir wrapper API Java en utilisant SWIG, l'interface générée SWIG a une construcotr comme - IExample(long cPtr, boolean cMemoryOwn) et la fonction globale devient createExample(IExample obj)

Le problème est quand je fais,

IExample exObject = new IExample(ExampleLibraryJNI.new_plong(), true /*or false*/); ExampleLibrary.createExample(exObject);

L'API createExample(...) au niveau de la couche C++ est appelée avec succès, mais lorsque l'appel revient à la couche Java, la variable cPtr (long) n'est pas mise à jour. Idéalement, cette variable doit contenir l'adresse de l'objet CExample.

J'ai lu dans la documentation que les typemaps peuvent être utilisés pour gérer les paramètres de sortie et les références de pointeur; Cependant, je ne suis pas en mesure de trouver le moyen approprié d'utiliser typemaps pour résoudre ce problème, ou toute autre solution de contournement.

S'il vous plaît suggérer si je fais quelque chose de mal, ou comment utiliser typemap dans une telle situation?

Répondre

0

Je ne sais pas comment résoudre ce problème avec des typemaps; Java ne supporte pas les paramètres de référence, donc la conversion serait très compliquée. Pourquoi ne pas simplement avoir createExample() retourner un IExample*? Si vous avez besoin de la valeur de retour pour quelque chose d'autre, je vous recommande de retourner std::pair<IExample*,OtherThing>, ou un type structuré similaire.