Comme Daff a écrit, vous ne pouvez pas « retourner un objet C++ à Java, » mais ce que vous pouvez faire est de retourner l'adresse de l'objet, comme une longue:
jlong obj_ptr = reinterpret_cast<jlong>(&obj);
Vous devez vous assurer quelque part dans un en-tête racine que la taille de jlong est suffisante pour contenir des pointeurs (cela devrait généralement l'être, car un Java long a une largeur de 64 bits). J'utilise assert statique Boost pour vérifier ceci:
#include <boost/static_assert.hpp>
BOOST_STATIC_ASSERT(sizeof(jlong)>=sizeof(void *));
L'objet du C doit vivre aussi longtemps qu'il (ou ses données) est nécessaire, que ce soit en Java ou C++ - de toute façon, il ne peut pas être supprimé par Java directement. Lorsque vous déterminez que vous pouvez le supprimer en toute sécurité, vous pouvez effectuer un autre appel JNI à partir de Java, en transmettant la valeur longue, l'afficher au pointeur approprié avec reinterpret_cast<SomeObject *>(the_jlong_value)
et le supprimer. Bien sûr, vous devez le supprimer manuellement, la JVM ignore totalement son existence, et toutes les mises en garde de la gestion manuelle de la mémoire s'appliquent ...
Comment renvoyer un objet C++ directement à Java? Ne devez-vous pas utiliser l'environnement JNI pour instancier l'objet Java approprié? – Daff
Ouais, c'est un peu ce que je pensais, je suis dans un nouvel endroit et je regarde ce code et je ne suis pas sûr que toutes les pièces sont en place. – arinte