JNI中 jstring与 char* 格式互转

JNI中 jstring与 char* 格式互转

//以下gcc能编译过,且正确,vc++下可能错误

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

jstring chartojstring( JNIEnv* env, char* pat )
{
jclass strClass = (*env)->FindClass(env,"Ljava/lang/String;");
jmethodID ctorID = (*env)->GetMethodID(env,strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = (*env)->NewByteArray(env,strlen(pat));
(*env)->SetByteArrayRegion(env,bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = (*env)->NewStringUTF(env,"utf-8");
return (jstring)(*env)->NewObject(env,strClass, ctorID, bytes, encoding);
}

7.中文处理

 


中文字符的处理往往是让人比较头疼的事情,特别是使用Java语言开发的软件,在JNI这个问题更加突出。由于Java中所有的字符都 是 Unicode编码,但是在本地方法中,例如用VC编写的程序,如果没有特殊的定义一般都没有使用Unicode的编码方式。为了让本地方法能够访问 Java中定义的中文字符及Java访问本地方法产生的中文字符串,我定义了两个方法用来做相互转换。

· 方法一,将Java中文字符串转为本地字符串

/**

第一个参数是虚拟机的环境指针

第二个参数为待转换的Java字符串定义

第三个参数是本地存储转换后字符串的内存块

第三个参数是内存块的大小

*/

int JStringToChar(JNIEnv *env, jstring str, LPTSTR desc, int desc_len)

{

 int len = 0;

 if(desc==NULL||str==NULL)

 return -1;

 //在VC中wchar_t是用来存储宽字节字符(UNICODE)的数据类型

 wchar_t *w_buffer = new wchar_t[1024];

 ZeroMemory(w_buffer,1024*sizeof(wchar_t));

 //使用GetStringChars而不是GetStringUTFChars

 wcscpy(w_buffer,env->GetStringChars(str,0));

 env->ReleaseStringChars(str,w_buffer);

 ZeroMemory(desc,desc_len);

 //调用字符编码转换函数(Win32 API)将UNICODE转为ASCII编码格式字符串

 //关于函数WideCharToMultiByte的使用请参考MSDN

 len = WideCharToMultiByte(CP_ACP,0,w_buffer,1024,desc,desc_len,NULL,NULL);

 //len = wcslen(w_buffer);

 if(len>0 && len<desc_len)

  desc[len]=0;

 delete[] w_buffer;

 return strlen(desc);

}

· 方法二,将C的字符串转为Java能识别的Unicode字符串


jstring NewJString(JNIEnv* env,LPCTSTR str)

{

 if(!env || !str)

  return 0;

 int slen = strlen(str);

 jchar* buffer = new jchar[slen];

 int len = MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,slen);

 if(len>0 && len < slen)

  buffer[len]=0;

 jstring js = env->NewString(buffer,len);

 delete [] buffer;

 return js;

}

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值