3
votes

Convertissez JNI -> jobject (essentiellement une carte et / ou une carte de carte dans un fichier java) en std :: map (c ++)

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.


1 commentaires

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.


3 Réponses :



4
votes

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:

  • Du côté Java, utilisez gson ou jackson pour sérialiser votre carte en JSON
  • Passez la chaîne JSON à travers la limite
  • Du côté C ++, désérialiser le JSON en std :: map

Je ne suis pas aussi familier avec le côté C ++, mais je vois des problèmes similaires résolus ici


0 commentaires

1
votes

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();
}


0 commentaires