JNI jobject 与 map互转

来源:互联网 发布:python 解释器 开源 编辑:程序博客网 时间:2024/05/23 11:57

//从c语言的map转java hashmap

jobject JavaHelper::cmap2jhashmap(std::map<char*,char*> cmap){

JNIEnv* env = JNU_GetEnv();
jclass jmapclass = env->FindClass("java/util/HashMap");
jmethodID mid = env->GetMethodID(jmapclass, "<init>", "()V");
jmethodID putmethod = env->GetMethodID(jmapclass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
jobject jmap = env->NewObject(jmapclass,mid);
jclass strClass = env->FindClass("java/lang/String");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jstring encoding = env->NewStringUTF("utf-8");
std::map<char*,char*>::iterator it;
for(it=cmap.begin();it != cmap.end();it++)
{
char* key=it->first;
jbyteArray keybytes = env->NewByteArray(strlen(key));
env->SetByteArrayRegion(keybytes, 0, strlen(key), (jbyte*)key);
jstring jkey = (jstring)env->NewObject(strClass, ctorID, keybytes, encoding);
char* value =it->second;
jbyteArray valuebytes = env->NewByteArray(strlen(value));
env->SetByteArrayRegion(valuebytes, 0, strlen(value), (jbyte*)value);
jstring jvalue = (jstring)env->NewObject(strClass, ctorID, valuebytes, encoding);
env->CallVoidMethod(jmap,putmethod,jkey,jvalue);
}
return jmap;
}

//java hashmap转c map
std::map<char*,char*> JavaHelper::jmap2cmap(jobject jobj){
std::map<char*,char*> cmap;
JNIEnv* env = JNU_GetEnv();
jclass jmapclass = env->FindClass("java/util/HashMap");
jmethodID jkeysetmid = env->GetMethodID(jmapclass, "keySet", "()Ljava/util/Set;");
jmethodID jgetmid = env->GetMethodID(jmapclass, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
jobject jsetkey = env->CallObjectMethod(jobj,jkeysetmid);
jclass jsetclass = env->FindClass("java/util/Set");
jmethodID jtoArraymid = env->GetMethodID(jsetclass, "toArray", "()[Ljava/lang/Object;");
jobjectArray jobjArray = (jobjectArray)env->CallObjectMethod(jsetkey,jtoArraymid);
if(jobjArray==NULL){
LOGD("param is NULL");
}
jsize arraysize = env->GetArrayLength(jobjArray);
int i=0;
for( i=0; i < arraysize; i++ ){
jstring jkey = (jstring)env->GetObjectArrayElement(jobjArray, i );
jstring jvalue = (jstring)env->CallObjectMethod(jobj,jgetmid,jkey);
char* key = (char*)env->GetStringUTFChars(jkey,0);
char* value = (char*)env->GetStringUTFChars(jvalue,0);
cmap[key]=value;
}
return cmap;
}
1 0