2016-07-26 16 views
2

C++マップをJavaに転送し、メソッドが動作するようにreturnパラメータを定義する方法がわかりません。文字列やintを返すパラメータは問題ありませんでしたが、マップを取得できません。
私のJavaメソッドは次のようになります。C++マップをjobject JNIに変換しますか?

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

私のC++コードは次のとおりです。

#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; 
} 

そしてもちろん、私は何とかJOBJECTするMMAPを変換する必要が私に言って、エラーが発生します。しかし、私はどのようにこれを行うには分かりません。

私はそのダブルポストを望んでいない、私はちょうど送信リストを扱ういくつかの質問を見つけた。

ありがとうございます。

+0

独立した問題ですが、あなたのメソッドの実装に含まれるものは、どの文字エンコーディングが 'mMap'で文字列を使用するかです。 '.c_str()'を使ったコードは、データにNUL文字が含まれていないことを前提としています。そして、 'NewStringUTF'を使ったコードは、エンコーディング(または少なくとも予想されるデータが出る限り)が_modified_ UTF-8として解釈可能であることを前提としています。 –

答えて

4

あなたはHashMap javaクラスを見つけるためにjni apiを使用し、次に要素の構築と挿入のためのメソッドを使用する必要があります。次にすべての要素を追加し、最後にこのマップを返します。それは次のようになります(警告 - 擬似コード!!!)

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私は通常アンドロイドでjniをコード化しますが、上記のコードは他のプラットフォームでも同じように動作します。

+3

ニース。しかし、単純に空の 'HashMap'オブジェクトをネイティブコードに渡し、' private native void sayHello(Map jmap);のように 'put'メソッドを呼び出す方が簡単だと思います。 –

+0

あなたの素早い答えのために@ mrtnjありがとう。私はそれを今日試してみて、私はそれが行くことができるかどうかを教えてくれます:) AndrewHenle thats素敵なアイデア、と私はそれが間違いなく他の解決策として簡単だろうと思うが、問題は私のプログラマーであるネイティブjava関数が呼び出される前に値が設定されています。しかし、とにかく仲間に感謝! –

+0

@AndrewHenleはい。いくつかのJNIをJavaに戻すのは、エラーが起こりにくいことがよくあります。 '私的なネイティブ'メソッドは行く方法です。しかし、 'public'メソッドは自然なJavaインターフェースを持つべきです。 –

関連する問題