5 votes

convertir une carte c++ en jobject JNI ?

Je veux transférer une carte C++ vers Java et je n'ai aucune idée de la manière de définir le paramètre de retour pour que la méthode fonctionne. Je n'ai eu aucun problème avec string ou int comme paramètres de retour, mais je n'arrive pas à faire fonctionner map.
Ma méthode Java ressemble à ceci :

private native Map<String,String> sayHello();

Mon code C++ est :

#include <stdio.h>
#include "stdafx.h"
#include "jni.h"
#include "HelloJNI.h"
#include <utility>
#include <map>
#include <string.h>
#include <iostream>

using namespace std;

JNIEXPORT jobject JNICALL Java_HelloJNI_sayHello
(JNIEnv *, jobject)
{
    map<string, string> mMap;
    mMap["1"] = "Ladi";
    mMap["2"] = "Dida";
    return mMap;
}

Et bien sûr, j'obtiens une erreur, me disant que je dois convertir mMap en jobject d'une manière ou d'une autre. Mais je n'ai aucune idée de comment faire.

J'espère qu'il ne s'agit pas d'un double post, je viens de trouver quelques questions concernant la transmission des listes.

Merci d'avance.

7voto

marcin_j Points 12237

Vous devez utiliser l'api jni pour trouver HashMap puis ses méthodes de construction et d'insertion d'éléments. Elle ajoute ensuite tous les éléments et renvoie enfin cette carte. Cela devrait ressembler à ce qui suit (avertissement - pseudocode ! !!)

env->PushLocalFrame(256); // fix for local references

jclass hashMapClass= env->FindClass(env, "java/util/HashMap");
jmethodID hashMapInit = env->GetMethodID(env, hashMapClass, "<init>", "(I)V");
jobject hashMapObj = env->NewObject(env, hashMapClass, hashMapInit, mMap.size());
jmethodID hashMapOut = env->GetMethodID(env, hashMapClass, "put",
            "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

for (auto it : mMap)
{
    env->CallObjectMethod(env, hashMap, put,
         env->NewStringUTF(it->first.c_str()),
         env->NewStringUTF(it->second.c_str()));
}

env->PopLocalFrame(hashMap);

return hashMap;

ps. Je code habituellement jni sous Android, mais le code ci-dessus devrait fonctionner de la même manière sous d'autres plateformes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X