J'ai une méthode native dans le fichier java: -
int cpp_native( std::string param1, std::map<std::string, float>& param2, std::map<std::string, std::map<std::string, float> >& param3) { }
Après avoir généré le fichier d'en-tête à partir de java, la carte est convertie en jobject dans la méthode du fichier d'en-tête: -
JNIEXPORT void JNICALL Java_com_jni_JNITest_test (JNIEnv *env, jobject self, jstring param1, jobject param2, jobject param3) { }
J'ai une méthode native dans cpp comme:
class JNITest{ public native void test(String param1, Map<String, Number> param2, Map<String, Map<String, Double>> param3) }
Q: - Je dois reconvertir Jobject en std :: map (cpp) pour passer il à la méthode native cpp, quelqu'un pourrait-il suggérer une approche standard pour faire de même? Merci d'avance.
3 Réponses :
Cela demandera un peu de lutte. Jetez un œil ici:
http://jnicookbook.owsiak.org/recipe-No-020/ a>
également, jetez un œil ici pour des exemples liés au passage de Map en code natif
https://github.com/mkowsiak/jnicookbook/tree/master / recettes / recetteNo037 https://github.com/mkowsiak/jnicookbook/tree/master/recipes/ recetteNo038
Nous avons beaucoup travaillé avec l'intégration C ++ / Java. Le problème avec le passage de structures de données complexes à travers la frontière est que vous devez rassembler les invocations de méthode, ce qui peut être une entreprise très complexe et sujette aux erreurs. J'ai trouvé beaucoup plus facile de faire quelque chose comme ceci:
Je ne suis pas aussi familier avec le côté C ++, mais je vois des problèmes similaires résolus ici
Vous pouvez utiliser la scapix :: link :: java C ++ JNI bibliothèque pour convertir automatiquement entre de nombreux types C ++ et Java. Voici un exemple :
#include <scapix/java_api/java/lang/System.h> #include <scapix/java_api/java/util/Locale.h> #include <scapix/java_api/java/text/DateFormatSymbols.h> using namespace scapix::link::java; using namespace scapix::java_api; void test1() { // C++ objects are automatically converted to and from corresponding Java types. // This works for any type supported by scapix::link::java::convert() interface, // which supports many STL types and can be extended for your own types. std::string version = java::lang::System::getProperty("java.version"); std::vector<std::string> languages = java::util::Locale::getISOLanguages(); std::vector<std::vector<std::string>> zone_strings = java::text::DateFormatSymbols::getInstance()->getZoneStrings(); std::map<std::string, std::string> properties = java::lang::System::getProperties(); }
Vous pouvez essayer d'accéder à std :: map depuis Java en utilisant, par exemple, JavaCPP: github.com/bytedeco/javacpp Faites-moi savoir si vous êtes intéressé, je pourrais vous fournir un exemple de code en guise de réponse.