转:JNI jstring与c++字符串类型转换函数

jstring与c++字符串类型转换函数

jstring str2jstring(JNIEnv* env,const char* pat)
{
	//定义java String类 strClass
	jclass strClass = (env)->FindClass("Ljava/lang/String;");
	//获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
	jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
	//建立byte数组
	jbyteArray bytes = (env)->NewByteArray(strlen(pat));
	//将char* 转换为byte数组
	(env)->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
	// 设置String, 保存语言类型,用于byte数组转换至String时的参数
	jstring encoding = (env)->NewStringUTF("GB2312"); 
	//将byte数组转换为java String,并输出
	return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}


std::string jstring2str(JNIEnv* env, jstring jstr)
{   
	char*   rtn   =   NULL;   
	jclass   clsstring   =   env->FindClass("java/lang/String");   
	jstring   strencode   =   env->NewStringUTF("GB2312");   
	jmethodID   mid   =   env->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");   
	jbyteArray   barr=   (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);   
	jsize   alen   =   env->GetArrayLength(barr);   
	jbyte*   ba   =   env->GetByteArrayElements(barr,JNI_FALSE);   
	if(alen   >   0)   
	{   
		rtn   =   (char*)malloc(alen+1);         
		memcpy(rtn,ba,alen);   
		rtn[alen]=0;   
	}   
	env->ReleaseByteArrayElements(barr,ba,0);   
	std::string stemp(rtn);
	free(rtn);
	return   stemp;   
}   

  

posted @ 2011-10-11 09:45  白羽雕弓  阅读(17874)  评论(0编辑  收藏  举报