JNI中 jstring与 char* 格式互转
来源:互联网 发布:qt在linux下的安装 编辑:程序博客网 时间:2024/06/09 18:36
JNI中 jstring与 char* 格式互转
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;
}
- JNI中 jstring与 char* 格式互转
- JNI中jstring 与 const char* 相互转换函数
- jni中jstring与char*转换的乱码问题
- JNI中jstring 与 const char* 相互转换函数
- JNI中jstring 与 const char* 的转换
- JNI数据类型转换: jstring与char*
- jni中jString和char*互转
- (转)jni jstring 、char* 类型的转换
- JNI中很有用的jstring 与 const char* 的相互转换函数
- JNI中很有用的jstring 与 const char* 的相互转换函数
- JNI中很有用的jstring 与 const char* 的相互转换函数
- Android JNI中C char *与Jstring转化引发的一次意外
- JNI中很有用的jstring 与 const char* 的相互转换函数
- android JNI调用 - char*与jstring相互转换
- Android JNI调用 - char*与jstring相互转换
- JNI 入门介绍(jstring与char*的转换)
- JNI 入门介绍(jstring与char*的转换)
- JNI 入门介绍(jstring与char*的转换)
- EasyUI中的combogrid实现分页功能
- 解决MSSQL 2008不能用IP登录的问题
- IIS里找不到应用程序池解决方法
- JS 获取select的value和text值
- 2013第二周上机任务项目一(有序的结构体数组)
- JNI中 jstring与 char* 格式互转
- 第一周任务——日期结构体、
- c#数据库存取图片的三种方式
- JS 操作Cookies 存取数组形式
- PUTTY工具命令学习
- C++实例 单文档模式生成消息窗口和消息响应
- 整数相乘
- oracle参数视图
- div 固定高度,设定比例的宽度,超出指定高度时竖直滚动条出现